- ベストアンサー
重複しない乱数整数を発生させる。
重複しない乱数整数を発生させるため、次のような構文を作りましたが、うまくいきません。 アドバイスをお願いします。 Sub RRR() Dim A, B, C, D, E As Integer A = 1 B = 10 For D = A To B Randomize E = Int((B - A + 1) * Rnd + A) Cells(D, 1) = E Next D End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
野生の勘で、1~10の整数がばらばらの順番に、重複せずに出てくれば良いものと考えます。 1. まず、要素数10の配列を定義して、1~10までの整数を順番に格納します。配列の名前を、仮にAとします。 2. Rondomizeで初期化します。 3. 次に乱数を2つ発生させます。乱数は1~10の範囲に収まるようにします。個々で発生した乱数を仮にm,nとします。 4. Aのm番目の要素の値と、n番目の要素の値を入れ替えます。 5. 3.と4.を気が済むまで(100回ぐらい?)繰り返します。 6. 配列Aを1番目の要素から順番に読むと、適当に乱れた数字が重複無く取り出せると思います。 こんな感じでいかがでしょうか?
その他の回答 (4)
- CupNaka
- ベストアンサー率22% (13/57)
よく伝わりにくかったですが、私も#4さんと同等の結果を予想します。 こんなカンジで出来そうな気はするんですが。。。 (テストしてないので結果は分かりかねます) Dim A As Integer '行始値 Dim B As Integer '行終値 Dim C As Integer '列 Dim D As Integer '行カウンタ Dim E As Integer '値格納 Dim F As Integer '重複カウンタ Dim AA() As Integer '重複チェック格納 A = 1 B = 10 C = 1 Randomize For D = A To B ReDim Preserve AA(D) AA(D) = Int((B - A + 1) * Rnd + A) 'AA(D) = Int(B * Rnd + 1) でも可かと... If D <> A Then For F = A To D - 1 If AA(F) = AA(D) Then AA(D) = Int((B - A + 1) * Rnd + A) F = A - 1 End If Next F End If E = AA(D) Cells(D, C) = E Next D 省略すれば、もっと簡単にもっと早い処理のものも書くことが出来ますが、これを参考に修正してもらえたら幸いです。 また配列を使うのが嫌なのであれば、セルの値から判別してもいいです。
お礼
ありがとう御座います。 試してみます。
- nandarou-1011
- ベストアンサー率50% (65/128)
確認ですが、「重複しない」とは、1~10の値が1回ずつ表示されて欲しいという意味ですか。 Randomizeステートメントは引数を省略すればTimer関数の戻り値を使用しますので、上記のようにRandomize単体で使用すれば毎回ランダムな数値が発生するはずです。
- nandarou-1011
- ベストアンサー率50% (65/128)
別件ですが、Dimの書き方を指摘させてください。 誤: Dim A,B,C,D,E As Integer 正: Dim A as Integer, B As Integer, C as ・・・ 前者の書き方ですと、A~DはVariant型になります。 なおVB.NETでは前者の書き方を受け付けるようです。
- nrb
- ベストアンサー率31% (2227/7020)
乱数整数を発生もとはPCの中にランダム数字が書き込まれています (乱数の数値テーブルがある) 通常の方法でやると同じ物が出てくる可能性があります そこで TIME(時間を)組み合わせる結構ランダムになりますよ
お礼
ありがとうございます。 単純な構文のみでは、重複しない乱数整数は発生しないということが解りました。 何か一工夫しなければならないという事なんですね。