C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

異なる乱数の生成

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■89000 / inTopicNo.1)  異なる乱数の生成
  
□投稿者/ なつ (25回)-(2018/10/25(Thu) 00:31:22)

分類:[VB.NET/VB2005 以降] 

2018/10/25(Thu) 00:32:45 編集(投稿者)
2018/10/25(Thu) 00:32:16 編集(投稿者)

Windows 10、VB 2017 です。
つまらぬ質問ばかりですみません。

Dim r1 As New System.Random(1000)
Dim r2 As Integer = r1.Next(1, 100)

これでは毎回、同じ乱数(r2)が生成されてしまいます。
毎回、異なる乱数を生成させる方法を教えてください。

引用返信 編集キー/
■89001 / inTopicNo.2)  Re[1]: 異なる乱数の生成
□投稿者/ Azulean (1000回)-(2018/10/25(Thu) 06:35:49)
2018/10/25(Thu) 06:37:38 編集(投稿者)

No89000 (なつ さん) に返信
> Dim r1 As New System.Random(1000)
> Dim r2 As Integer = r1.Next(1, 100)
>
> これでは毎回、同じ乱数(r2)が生成されてしまいます。
> 毎回、異なる乱数を生成させる方法を教えてください。

一般論として、コンピューターでは完全な乱数は得られません。
このため、コンピューターの世界では Seed を元にした擬似乱数を計算する実装になっています。
計算式で求められる結果であるため、同じ Seed で始める限り、同じ順番の数値列が得られることになります。
今回の場合は Random のコンストラクタに 1000 といった数値を与えており、これが Seed となりますので r2 は必ず同じ値になります。

解決策としては、まず、r1 のコンストラクタ引数を省略して時間に基づいた Seed を与えるようにしましょう。
Random の生成が一瞬で何回もおこなわれる状況であれば、毎回生成するのではなく、1 つの Random のインスタンスに対して呼び出すようにしないといけないかもしれません。

引用返信 編集キー/
■89002 / inTopicNo.3)  Re[1]: 異なる乱数の生成
□投稿者/ 774RR (634回)-(2018/10/25(Thu) 06:41:08)
「異なる」という言葉の解釈がどうだかわからないんだけど、同じ乱数列が得られるってことなら
seed が同じなので当然(そうでないとシミュレーションに使えない)
System.Random() は現在時間を seed にするので、「立て続けに呼ばない限り」別乱数列が得られる。

サイコロを振って 1, 5, 3, 3, 1, 4, 6, 5, 2 のように「同じ数値が複数回得られる」のがイヤ
ってことだと、それは乱数の仕様通りなわけで、別の方策を講じる必要があるっすね。

引用返信 編集キー/
■89003 / inTopicNo.4)  Re[1]: 異なる乱数の生成
□投稿者/ shu (1148回)-(2018/10/25(Thu) 07:25:35)
No89000 (なつ さん) に返信
> Dim r1 As New System.Random(1000)
> Dim r2 As Integer = r1.Next(1, 100)
多分聞きたいことの回答はついていると思いますが、
Random(1000)の1000はなぜ指定したのでしょうか?
引数の意味を理解してから使用しないと思わぬ処理が
発生しますので気を付ける必要があります。
引用返信 編集キー/
■89012 / inTopicNo.5)  Re[1]: 異なる乱数の生成
□投稿者/ furu (187回)-(2018/10/25(Thu) 11:53:24)
No89000 (なつ さん) に返信
> Dim r1 As New System.Random(1000)
dobon.netのサンプルでしょうか?

そこにも「'シード値が変わらなければ毎回同じ乱数を返す 」と
書かれてますよ。

個人的には
r1をstatic変数にして
Random()で1回のみ生成し
きれいな乱数(?)を
取得するようにしています。
引用返信 編集キー/
■89024 / inTopicNo.6)  Re[1]: 異なる乱数の生成
□投稿者/ なつ (26回)-(2018/10/25(Thu) 14:36:02)
774RR さん
Azulean さん
shu さん
furu さん
ありがとうございます。

説明不足ですみません。
ネットのを参考にさせて頂きましたが他の方法でもあればお願いします。

   For i = 0 To 200
       Dim r1 As New System.Random(1000)
       Dim r2 As Integer = r1.Next(1, 3000)

       'ここで毎回違う r2 を使って他の処理をしたいのです。  

   Next

引用返信 編集キー/
■89028 / inTopicNo.7)  Re[2]: 異なる乱数の生成
□投稿者/ shu (1149回)-(2018/10/25(Thu) 15:53:28)
No89024 (なつ さん) に返信
> 774RR さん
> Azulean さん
> shu さん
> furu さん
> ありがとうございます。
> 
> 説明不足ですみません。
> ネットのを参考にさせて頂きましたが他の方法でもあればお願いします。
> 
>    For i = 0 To 200
>        Dim r1 As New System.Random(1000)
>        Dim r2 As Integer = r1.Next(1, 3000)
> 
>        'ここで毎回違う r2 を使って他の処理をしたいのです。  
> 
>    Next

Dim r1 As New System.Random(1000)
For i = 0 To 200
    Dim r2 As Integer = r1.Next(1, 3000)
Next

とすれば,ループ内では異なる値になるが実行しなおしたときにiの値に対するr2の値は同じになります。



Dim r1 As New System.Random()
For i = 0 To 200
    Dim r2 As Integer = r1.Next(1, 3000)
Next

とすれば実行しなおすごとに、iの値に対するr2の値も変わります。


引用返信 編集キー/
■89029 / inTopicNo.8)  Re[2]: 異なる乱数の生成
□投稿者/ 774RR (635回)-(2018/10/25(Thu) 15:54:03)
違う r2 というのの合意があなたと読者との間でできていないのでお互いに通じていないっつか。

System.Random は擬似乱数を生成するクラスで、たいていの場合
・1つ new して、その1つを再利用する(毎回 new しない)
・ Random.Next() が返却する値が乱数、呼ぶたびに更新される
・シミュレーション等で再現性が必要な場合以外は引数なしコンストラクタを使う

C# だけど

static void Main() {
    System.Random r2 = new System.Random();
    for (int i=0; i<10; ++i) {
        Console.WriteLine(r2.Next(1, 3000));
    }
}
としとけば、1回実行するたびに乱数が10個得られるし、実行するたびに違う値になる、っすよ。


引用返信 編集キー/
■89031 / inTopicNo.9)  Re[3]: 異なる乱数の生成
□投稿者/ なつ (27回)-(2018/10/25(Thu) 16:53:03)
No89028 (shu さん) に返信

それだけのことなんですね。
ありがとうございます。
解決しました。
解決済み
引用返信 編集キー/
■89032 / inTopicNo.10)  Re[3]: 異なる乱数の生成
□投稿者/ なつ (28回)-(2018/10/25(Thu) 16:54:40)
No89029 (774RR さん) に返信

すみません。
C# は分かりませんので(汗;

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ