• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[C#]2つのランダム文字列を作りたい)

[C#]2つのランダム文字列を生成したい

このQ&Aのポイント
  • 質問者はC#で2種類のランダム文字列を生成したいが、同じ文字列が生成される現象が起こっている。質問者はランダム文字列を生成するための関数を使用しており、関数の中で指定された桁数のランダムな文字列を生成している。
  • 関数内で使用されている配列には、数字とアルファベットの文字列が含まれており、ランダムな要素を選択することで文字列を生成している。しかし、同じ文字列が生成される問題が発生している。
  • 質問者はランダムな文字列を生成する際にThread.Sleep(100)を使用すると、同じ文字列が生成されないことに気づいているが、なぜこのような現象が起こるのか理解していない。初心者ながら、解決策を探している。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

コンピュータで使われている乱数は、実際には「疑似乱数」と言って、一見バラバラで乱数と言ってもいい性質を持っていますが、実際には計算によって求められたものです。 それまでの値に、なんらかの計算をした結果を、「次の乱数」として使います。(Nextというメソッド名もそこに由来) このとき、一番最初の状態になるものを「種(シード,seed)」と言います。 「前の状態から新しい乱数を計算する」ということから「種が同じなら、乱数列も同じになる」という性質があります。 バラバラにするための常套手段として、種に現在時刻から求めた値を使うことで、実行時刻が変化すれば値が変わるようにする、というのがあります。ただ、無限に細かい時刻をそのままコンピュータでは扱えないので、適当な単位(例えば、秒単位)になってしまい、単位時間以内(例えば、秒単位なら1秒以内)なら、同じ乱数列になってしまう、という問題があります。 Random.Random()のマニュアルを読むと http://msdn.microsoft.com/ja-jp/library/h343ddh9%28v=vs.95%29.aspx 「既定のシード値はシステム時計から取得されるため、その分解能は有限です。 その結果、既定のコンストラクターを呼び出すことによって連続で作成される、異なる Random オブジェクトの既定のシード値は同一であるため、同一の乱数セットが生成されます。」 と、明記されています。 public static string ランダム(int 桁数) を2回呼び出していますが、その度に、Random Random = new System.Random();で新しい System.Randomオブジェクトを生成しています。 間にいくつかの処理が入っているとは言え、非常に短時間で終わるものなので、この「連続で作成される、異なる Random オブジェクト」となっている、と考えてよいでしょう。 対処法は、マニュアルにも書いてあります

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

http://msdn.microsoft.com/ja-jp/library/system.random%28v=vs.95%29.aspx コンストラクターのRandom()の説明と、解説をよく読んでみてください。 それに起きてる現象を組み合わせて考えれば、原因はわかるかと思います。

関連するQ&A

専門家に質問してみよう