• ベストアンサー

ランダムなメッセージを出力して…

Private Sub Command1_Click() Dim i, R_Gohan(10) Call Randomize R_Gohan(1) = "カレー" R_Gohan(2) = "うどん" R_Gohan(3) = "ラーメン" R_Gohan(4) = "チャーハン" R_Gohan(5) = "オムライス" i = Int(Rnd(1) * 5) + 1 MsgBox ("今日のご飯は" + R_Gohan(i) + "です") End Sub 上記のように、ランダムなメッセージを出力するプログラムを VB5.0環境にて作成しています。 これを、昨日の入力データがあった場合、それを選択肢から除外 するようにしたいのですが(10日にカレーだったら、11日は カレーは出ないように)、このような機能を追加するにはどうしたら 良いのでしょうか?

noname#32335
noname#32335

質問者が選んだベストアンサー

  • ベストアンサー
  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

まぁ、一日毎に入力するのであれば、 入力したデータをファイルに書き、 翌日それを読み込んで、「同じメッセージだったらもう一回ランダム」のようにするのでしょう。 そうではなく、例えば昨日の入力データを再入力させるので良ければ、「同じメッセージだったらもう一回ランダム」でいけますね。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

回を重ねるにつれて、選ばれる対象が減っていっても良いなら、配列の後部(インデックスの大きい配列部分)に 選択されたものは持って行き、Int(Rnd(1) * 5) + 1 の5を次回は4にして、ハイなインデックスは乱数に出ないようにして、乱数発生を実行させてはどうでしょう。 ただ前回の結果(状態)を次ぎに伝えるには、ソースコード上では無理で、外部ファイルにUBOUNDと配列全体を保存し、次回開始に当たってファイルから、配列データ読み込む必要があるでしょう。

回答No.2

色々方法はありそうですが… たとえば R_Gohanを二次元配列にして後ろ側を0or1とかのフラグ変わりにする とか 乱数を発生させるとこでloopさせて過去に入力されていないものまで繰り返す とか。

関連するQ&A

  • 乱数がうまくランダムされない

    コマンドボタンを押すごとに画像をランダムに表示したいのですが 決まった順番で表示されてしまいます。 (画像はMy Picturesに440個入っています。) Sub ボタン_Click() Dim i As Long '画像をランダムに表示 i = Int((440 - 1 + 1) * Rnd + 1) Forms("フォーム1").ボタン.Picture = "D:\My Documents\My Pictures\画像" & i & ".ico" Debug.Print i End Sub コマンドボタンを何回かクリックし 上記のコート゛を実行してイミディエイトウインドウで確認すると 311 235 255 128 133 341 7 335 359 となります。 何回やってもこの順番です。 なんの規則かわかりません。 確かにランダムなのですが 本当にランダムにするのはどうすればいいでしょうか? 「i = Int((440 - 1 + 1) * Rnd + 1)」 ここに原因があると思うのですが どうすればいいでしょう? よろしくお願いします。

  • マクロでセルをランダムに並び替えたい

    マクロ初心者です。 Sheet1のB4に1、B1003に1000 というように整数が小さい順番にセルに入力してあり、 Sheet2のB4からB1003までにそれらのセルをランダムに並べ換え、 さらにそれらのセルをSheet3のB4からB1003に大きい順(B4に1000、B1003に1といったように)に並び替えたいのですが、 どうすればいいでしょうか。 Sub 並び替え() Dim RndArr(999, 0) As Variant Dim i As Integer, c As Integer Dim rndTmp As Integer Randomize i = 0 RndArr(i, 0) = Int(1000 * Rnd) + 1 Do Re: rndTmp = Int(1000 * Rnd) + 1 For c = 0 To i If rndTmp = RndArr(c, 0) Then GoTo Re Next c i = i + 1 RndArr(i, 0) = rndTmp Loop Until i > 999 Range("b4.Sheet2", "b1003.Sheet2") = RndArr End Sub 今わかっている状況は上記の通りですが、 このマクロだと、セルを並び替えているのではなく乱数を当てはめているだけなので、 整数が重複してしまいます。 よろしくお願いします。

  • VB.NETとして書き換え

    コマンドボタンを押すたびに ココ という文字をテキストボックスに書く。 Private Sub Command1_Click() Dim i As Integer i = Int(Rnd * 4) For c = 0 To 4 Text1(c).Text = "" Next c Text1(i).Text = "ココ" End Sub VB6ではこんなふうになると思います。 .NETではどう書けばいいのでしょうか?

  • 標準モジュールとイベントの質問

    初めて質問します。 ビジュアルベーシックで標準モジュールで ボタンのクリックイベントを実行したいのですが どうやってプログラムすればいいんでしょうか? 今の会社に入っていきなりVBの仕事させられて とっても困っています。 Private Sub Frm1Command1_Click() Call Module1.Frm1Command1_Click End Sub こんな書き方じゃなくて、標準モジュール内で Public Sub Command1_Click() MsgBox "sine" End Sub って書いて実行できるようにしなくてはダメなんです。 どうすればいいんでしょうか? もしかして無理なんでしょうか? これ、上司の嫌がらせだったらイヤですね・・・。

  • 大食いについて

    大食いについて マクドナルドのハンバーガー120円のを10個完食するのとすき家のキングカレー、キング牛丼と他の店のザルうどん1kg スープうどん1kg スープの重さ除く オムライス1.3kg チャーハン1.3kgでどっちの方が大食いしやすいですか?みなさんのランキングが知りたいです!

  • Rnd関数の戻り値

    ボタンのクリックでRnd関数の戻り値をLabelのCaptionに表示させるという シンプルな事をしていたのですが不定期に0~0.9999....以外の数値(?)が 帰ってきます。 例えば 5.244088E-02 等です。 発生に規則性は見当たりませんが、必ず1以上の数で最後にE-02が付きます。 書式は Private Sub Command1_Click()   Label1.caption = Rnd End Sub これだけです。 何かご存知の方がいらっしゃいましたらレスをお願い致します。

  • 乱数で・・・

       ラベル10枚に1~10までを乱数を入れたいのです ただしダブらない どうすればいいのでしょうか?? 自分で考えたのですがバグがあります ※コマンドをクリック ※クローンは用意済み Private Sub Command1_Click() Dim a(0 To 9) For i = 0 To 9 a(i) = Int(Rnd * 10)+1  For b = 0 To 9   If a(i) = a(b) Then     If i <> b Then     a(i) = Int(Rnd * 10) + 1     End If   End If   Next b Next i For c = 0 To 9 Label1(c).Caption = a(c) Next c End Sub バグの原因はなんとなくわかるのですがどうすればいいのか分かりません 素人ですいません。

  • 重複しない乱数発生

    初めて投稿させて頂きます。 サイコロを振って、一度出た目はもう出ないような ゲームをプログラミングしています。 Dim i As Integer Dim j As Integer Dim t As Integer Dim r(6) As Integer 'コンピュータ Dim b As Integer 'プレイヤー Private Sub Command1_Click() b = Val(Text2.Text) Randomize r(6) = Int(Rnd * 6 + 1) '1~6までの乱数発生 Text1.Text = r(6) For i = 1 To n r(i) = i 'r(i)~r(n)に1~nの値を格納 Next i For i = n To 2 Step -1 j = Int((i - 1) * Rnd() + 1) '1~i-1の範囲の乱数 t = r(i): r(i) = r(j): r(j) = t 'r(i)とr(j)の交換 Next i For i = 1 To n Text1.Text = r(i) Next i If r(i) < j Then Label2.Caption = "あなたの勝ちです" Else Label2.Caption = "あなたの負けです" End If 幾つか考えてこれで落ち着いたのですが、これでは まだ重複してしまいます。 どこが問題なのかご指摘頂けるようお願いします。 一度出た目は出ないようにするので、全部で6回試行 することになります。またその6回分の結果を表示したいのですが、 Text3.Text = r(1) Text4.Text = r(2) Text5.Text = r(3) Text6.Text = r(4) Text7.Text = r(5) Text8.Text = r(6) としてしまうと全てに0が表示され、結果が表示されません。 これについても回答をお願いします。 まだ初心者ですが、よろしくお願いします。

  • 画像のランダム表示

    初心者なのですがVisual Studio6.0でもぐらたたきゲームを利用した作品を現在制作しています。内容は決まった画像がランダムでImageコントロールに表示され、それをクリックできると画像が変わり得点加算、クリックできないと画像が変わり減点というゲームです。現在Imageコントロールに決まった画像を呼び出す処理が完成しました。そして追加機能としてクリックできたらボーナスポイントの画像をImageコントロールに何分の何かの確率で表示させたいのですがわからない状態です。ちなみに画像は私のパソコンのDドライブから呼び出して表示させています。 どういった命令文を打ったら良いのかわかる方教えて下さい。宜しくお願いします。 こちらがプログラムです。 Option Explicit Const MinImgAry = 0 Const MaxImgAry = 15 Const GameTime = 15 Dim HitFlg As Integer Dim TEN As Integer Dim HoleNum As Integer Dim IconAry(2) As String Private Sub Command1_Click() Command1.Enabled = False Option1.Enabled = False Option2.Enabled = False Option3.Enabled = False HitFlg = 0 TEN = 0 Text1.Text = Str(TEN) Timer1.Enabled = True Timer2.Enabled = True End Sub Private Sub Command2_Click() Form1.Show End Sub Private Sub Form_Load() Dim StrPath As String StrPath = App.Path If Right(StrPath, 1) <> "\" Then StrPath = StrPath + "\" End If IconAry(0) = "D:制作\5\画像1.bmp" IconAry(1) = "D:制作\5\画像2.bmp" IconAry(2) = "D:制作\5\画像3.bmp" End Sub Private Sub Image1_Click(Index As Integer) Image1(Index).Enabled = False HitFlg = -1 End Sub Private Sub Option1_Click() Timer1.Interval = 1000 End Sub Private Sub Option2_Click() Timer1.Interval = 800 End Sub Private Sub Option3_Click() Timer1.Interval = 500 End Sub Private Sub Timer1_Timer() Static CtlFlg As Integer Select Case CtlFlg Case 0 Image1(HoleNum).Enabled = False Image1(HoleNum).Visible = False HoleNum = Int((MaxImgAry - _ MinImgAry + 1) * Rnd + MinImgAry) Image1(HoleNum).Picture = _ LoadPicture(IconAry(0)) CtlFlg = 1 Image1(HoleNum).Visible = True Image1(HoleNum).Enabled = True Exit Sub Case 1 Image1(HoleNum).Enabled = False If HitFlg Then HitFlg = 0 Image1(HoleNum).Picture = _ LoadPicture(IconAry(2)) TEN = TEN + 1 Text1.Text = Str(TEN) Else Image1(HoleNum).Picture = _ LoadPicture(IconAry(1)) TEN = TEN - 1 Text1.Text = Str(TEN) End If CtlFlg = 0 Exit Sub End Select End Sub Private Sub Timer2_Timer() Static TimeCnt As Long TimeCnt = TimeCnt + 1 If TimeCnt <> GameTime Then Exit Sub End If Timer1.Enabled = False Timer2.Enabled = False MsgBox "おしまい" TimeCnt = 0 Command1.Enabled = True Image1(HoleNum).Enabled = False Image1(HoleNum).Visible = False Option1.Enabled = True Option2.Enabled = True Option3.Enabled = True End Sub

  • VBAでフォームにおけるコマンドが実行されません。

    なんどもすいません。二列目に、二桁の整数の足し算を出題することができるたし算の作問プログラムと、続いて三列目に、足し算の解答をして、それの正誤を確かめるプログラムを、それぞれフォームで”問題”、”採点”とした時、一回フォームのウィンドウを閉じてしまうと”採点”のコマンドを押しても、うまく実行されません。 im Ans() As Long Dim n As Variant Private Sub monndai_Click() Dim x As Long, y As Long Columns("B:F").Clear n = InputBox("問題数は?") If Not IsNumeric(n) Then Exit Sub If n <= 0 Then Exit Sub ReDim Ans(n) As Long For i = 1 To n Randomize x = Int(Rnd * 100) Randomize y = Int(Rnd * 100) Ans(i) = x + y Cells(i, 2) = "(" & i & ") " & x & " + " & y & " = " Next i End Sub Private Sub saiten_Click() t = 0 Dim i As Long For i = 1 To n If Cells(i, 3) = Ans(i) Then Cells(i, 4) = "○": t = t + 1 Else Cells(i, 4) = "×": End If Next i tokutenn = "貴方の正答率は" & Int(t / n) & "%です" End Sub (注)tokutennはフォームのテキストボックスのオブジェクト名です。

専門家に質問してみよう