いつもありがとうございます。
2種類のランダム文字列を作りたいのですが、
なぜか同じ文字列が作成されるという現象が起こります。
以下の関数を用意して
public static string ランダム(int 桁数)
{
string[] codelist = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
Random Random = new System.Random();
for (int i = 0; i < 桁数; i++)
{
randomcode += codelist[Random.Next(0, 36)];
}
return randomcode;
}
textBox1.Text = ランダム(10);
textBox2.Text = ランダム(10);
とやっても、同じランダムの文字列が入ってしまいます。
間に、
Thread.Sleep(100);
とか入れると変わるのですが・・・
理由がわかりません。
初心者的質問ですみませんがよろしくお願いします。
No.2ベストアンサー
- 回答日時:
コンピュータで使われている乱数は、実際には「疑似乱数」と言って、一見バラバラで乱数と言ってもいい性質を持っていますが、実際には計算によって求められたものです。
それまでの値に、なんらかの計算をした結果を、「次の乱数」として使います。(Nextというメソッド名もそこに由来)
このとき、一番最初の状態になるものを「種(シード,seed)」と言います。
「前の状態から新しい乱数を計算する」ということから「種が同じなら、乱数列も同じになる」という性質があります。
バラバラにするための常套手段として、種に現在時刻から求めた値を使うことで、実行時刻が変化すれば値が変わるようにする、というのがあります。ただ、無限に細かい時刻をそのままコンピュータでは扱えないので、適当な単位(例えば、秒単位)になってしまい、単位時間以内(例えば、秒単位なら1秒以内)なら、同じ乱数列になってしまう、という問題があります。
Random.Random()のマニュアルを読むと
http://msdn.microsoft.com/ja-jp/library/h343ddh9 …
「既定のシード値はシステム時計から取得されるため、その分解能は有限です。 その結果、既定のコンストラクターを呼び出すことによって連続で作成される、異なる Random オブジェクトの既定のシード値は同一であるため、同一の乱数セットが生成されます。」
と、明記されています。
public static string ランダム(int 桁数) を2回呼び出していますが、その度に、Random Random = new System.Random();で新しい System.Randomオブジェクトを生成しています。
間にいくつかの処理が入っているとは言え、非常に短時間で終わるものなので、この「連続で作成される、異なる Random オブジェクト」となっている、と考えてよいでしょう。
対処法は、マニュアルにも書いてあります
No.1
- 回答日時:
コンストラクターのRandom()の説明と、解説をよく読んでみてください。
それに起きてる現象を組み合わせて考えれば、原因はわかるかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
vb.net オブジェクト指向につい...
-
Excelで =EMBED("Acrobat Docu...
-
error C2712: オブジェクト ア...
-
ビジュアルC++でボタンの有...
-
プリコンパイルされたSQL文を取...
-
多人数のじゃんけんプログラム
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
JSPのout.printについて
-
Listに格納されているオブジェ...
-
空の文字列とnullと""
-
ADO オブジェクトの渡し方
-
VBA 同じ名前のオブジェクトを...
-
VBからBATファイルを起動して戻...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
戻り値がクラスオブジェクト
-
エプソンVP-930のESC/Pの操作に...
-
Date型オブジェクトから日付の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Object型からDouble型へのキャスト
-
JAVAからHTMLへ値を返す方法
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
VBA 同じ名前のオブジェクトを...
-
ASP.net 教えてください!!(...
-
Vbで通常使用するプリンターを...
-
newは明示的にした方が良いのか?
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
bmp画像をjpegやpng画像に圧縮...
-
Accessの連結・非連結オブジェ...
おすすめ情報