アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

A 回答 (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番目の要素から順番に読むと、適当に乱れた数字が重複無く取り出せると思います。

こんな感じでいかがでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/09 12:33

よく伝わりにくかったですが、私も#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

省略すれば、もっと簡単にもっと早い処理のものも書くことが出来ますが、これを参考に修正してもらえたら幸いです。
また配列を使うのが嫌なのであれば、セルの値から判別してもいいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/09 12:36

確認ですが、「重複しない」とは、1~10の値が1回ずつ表示されて欲しいという意味ですか。



Randomizeステートメントは引数を省略すればTimer関数の戻り値を使用しますので、上記のようにRandomize単体で使用すれば毎回ランダムな数値が発生するはずです。
    • good
    • 0

別件ですが、Dimの書き方を指摘させてください。



誤: Dim A,B,C,D,E As Integer

正: Dim A as Integer, B As Integer, C as ・・・

前者の書き方ですと、A~DはVariant型になります。
なおVB.NETでは前者の書き方を受け付けるようです。
    • good
    • 0

乱数整数を発生もとはPCの中にランダム数字が書き込まれています


 (乱数の数値テーブルがある)
 通常の方法でやると同じ物が出てくる可能性があります

 そこで TIME(時間を)組み合わせる結構ランダムになりますよ
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!