none
2つの整数を乱数として取得するときのプラスマイナスの組み合わせ RRS feed

  • 質問

  • 計算ドリル(正の数と負の数)のアプリを作っています。

    2つの数は,次のようにして取得しています。
           Random cRandom = new System.Random();
                a = cRandom.Next(-6, 6);
                b = cRandom.Next(-6, 6);

    このとき,2数のプラスマイナスの組み合わせが気になったので質問させていただきます。
    <気になっていること>
    あるとき,(+,-)の組み合わせがでたとき,この組み合わせが連続して3・4回続くことがよくあります。
    (-,+),(+,-),(-,-),(+,+),(0,-)・・・などの組み合わせもランダムに繰り返すことなく,出てきてくれることをきたいしているのですが。

    +-の2種類しかないのだから,仕方がないのかなとおもっていますが・・・

    なにか,いい方法があれば教えてください。
    よろしくお願いします。

    2013年4月22日 3:37

回答

  • このコードからは読み取れませんでしたが、

    • 毎回 new System.Random() から実行する
    • cRandom を保持しておいて、毎回では cRandom.Next(-6, 6) のみを呼び出す

    どちらでしょうか?

    前者であれば、乱数としての使い方を間違えていますので、まずは後者を試していただく必要はあります。

    後者のように書かれていても生成される乱数に不満があるということでしたら、RNGCryptoServiceProviderクラスなどRandomNumberGeneratorクラスの派生クラスを使用してみてください。

    この辺りのことはRandomクラスの解説に書かれています。ドキュメントをよく読むことをお勧めします。

    • 回答としてマーク imsz 2013年4月22日 7:05
    2013年4月22日 4:37
  • 佐祐理さんが最初におっしゃっているような根本的な間違いが無いことを前提としてですが、ランダムである以上、ある程度の確率でそういうことは発生します。

    ものすごくラフに計算すると、例えば3回連続なら、10題出題するだけでも、40%程度の確率で発生するような感じです。まあ確率計算は間違っているかもですが、少なくともそれなりの確率で発生することは確かです。

    要は、人間的なでたらめさと、擬似乱数とはいえ本当のでたらめさでは、感覚的に違いが出るのは致し方ないということです。
    本当に避けたいなら条件判断を追加して、例えば3回連続ならもう一度ランダムで取り出すという風にやるしかないと思います。

    念のため、この問題はRNGCyptoServiceProviderなどを使用しても避けることはできません(乱数の品質は上がっても根本的な問題は解決されません)。
    この問題に限って言えば、乱数の品質による傾向が出る以前の問題だと思います。

    • 回答としてマーク imsz 2013年4月22日 7:06
    2013年4月22日 6:31

すべての返信

  • このコードからは読み取れませんでしたが、

    • 毎回 new System.Random() から実行する
    • cRandom を保持しておいて、毎回では cRandom.Next(-6, 6) のみを呼び出す

    どちらでしょうか?

    前者であれば、乱数としての使い方を間違えていますので、まずは後者を試していただく必要はあります。

    後者のように書かれていても生成される乱数に不満があるということでしたら、RNGCryptoServiceProviderクラスなどRandomNumberGeneratorクラスの派生クラスを使用してみてください。

    この辺りのことはRandomクラスの解説に書かれています。ドキュメントをよく読むことをお勧めします。

    • 回答としてマーク imsz 2013年4月22日 7:05
    2013年4月22日 4:37
  • 佐祐理さんが最初におっしゃっているような根本的な間違いが無いことを前提としてですが、ランダムである以上、ある程度の確率でそういうことは発生します。

    ものすごくラフに計算すると、例えば3回連続なら、10題出題するだけでも、40%程度の確率で発生するような感じです。まあ確率計算は間違っているかもですが、少なくともそれなりの確率で発生することは確かです。

    要は、人間的なでたらめさと、擬似乱数とはいえ本当のでたらめさでは、感覚的に違いが出るのは致し方ないということです。
    本当に避けたいなら条件判断を追加して、例えば3回連続ならもう一度ランダムで取り出すという風にやるしかないと思います。

    念のため、この問題はRNGCyptoServiceProviderなどを使用しても避けることはできません(乱数の品質は上がっても根本的な問題は解決されません)。
    この問題に限って言えば、乱数の品質による傾向が出る以前の問題だと思います。

    • 回答としてマーク imsz 2013年4月22日 7:06
    2013年4月22日 6:31
  • 佐祐理さん,なちゃさん,ありがとうございます。

    (佐祐理さん)どちらでしょうか?>「毎回 new System.Random() から実行する」でした。

    教えていただいたとおりに直して実行してみたところ,同じパターンの繰り返しはかなり減りましたので,とりあえはこのままでいこうと思っています。

    2013年4月22日 7:14