• ベストアンサー

重複しない乱数整数を発生させる。

重複しない乱数整数を発生させるため、次のような構文を作りましたが、うまくいきません。 アドバイスをお願いします。 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

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

  • ベストアンサー
  • hide9048
  • ベストアンサー率42% (6/14)
回答No.4

野生の勘で、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番目の要素から順番に読むと、適当に乱れた数字が重複無く取り出せると思います。 こんな感じでいかがでしょうか?

YON56
質問者

お礼

ありがとうございます。 単純な構文のみでは、重複しない乱数整数は発生しないということが解りました。 何か一工夫しなければならないという事なんですね。

その他の回答 (4)

  • CupNaka
  • ベストアンサー率22% (13/57)
回答No.5

よく伝わりにくかったですが、私も#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 省略すれば、もっと簡単にもっと早い処理のものも書くことが出来ますが、これを参考に修正してもらえたら幸いです。 また配列を使うのが嫌なのであれば、セルの値から判別してもいいです。

YON56
質問者

お礼

ありがとう御座います。 試してみます。

回答No.3

確認ですが、「重複しない」とは、1~10の値が1回ずつ表示されて欲しいという意味ですか。 Randomizeステートメントは引数を省略すればTimer関数の戻り値を使用しますので、上記のようにRandomize単体で使用すれば毎回ランダムな数値が発生するはずです。

回答No.2

別件ですが、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)
回答No.1

乱数整数を発生もとはPCの中にランダム数字が書き込まれています  (乱数の数値テーブルがある)  通常の方法でやると同じ物が出てくる可能性があります  そこで TIME(時間を)組み合わせる結構ランダムになりますよ

関連するQ&A