1

Int32 に含まれる可能性のあるすべての数値に対して乱数を生成したい場合、次のコードは妥当な方法でしょうか? それが良い考えではないかもしれない理由はありますか?(つまり、とにかく少なくとも Random.Next() 自体と同じくらい良い均一な分布)

    public static int NextInt(Random Rnd) //-2,147,483,648 to 2,147,483,647
    {
         int AnInt;
         AnInt = Rnd.Next(System.Int32.MinValue, System.Int32.MaxValue);
         AnInt += Rnd.Next(2);
         return AnInt;
    }
4

4 に答える 4

3

を使用Random.NextBytesして 4 バイトを取得し、 を使用BitConverter.ToInt32してそれらをint.

何かのようなもの:

byte[] buf = new byte[4];
Rnd.NextBytes(buf);
int i = BitConverter.ToInt32(buf,0);
于 2012-07-08T08:16:54.683 に答える
0

ランダムなバイトを 8KB のバッファに取得し、ランダムなバイトから変換して数値を配布するクラスがあります。これにより、完全な int 分布が得られます。8KB のバッファを使用すると、新しいランダム byte[] ごとに NextBytes を呼び出す必要がなくなります。

    // Get 4 bytes from the random buffer and cast to int (all numbers equally this way 
    public int GetRandomInt()
    {
        CheckBuf(sizeof(int));
        return BitConverter.ToInt32(_buf, _idx);
    }

    // Get bytes for your buffer. Both random class and cryptoAPI support this
    protected override void GetNewBuf(byte[] buf)
    {
        _rnd.NextBytes(buf);
    }

    // cyrptoAPI does better random numbers but is slower
    public StrongRandomNumberGenerator()
    {
        _rnd = new RNGCryptoServiceProvider();
    }
于 2012-07-08T08:22:11.673 に答える
0

一様分布とは、各数値を 1 回だけ取得するという意味ではありません。そのためには順列が必要です

ここで、40 億の数字すべてをランダムに並べ替える必要がある場合は、少し行き詰まります。.NET では、オブジェクトを 2 GB より大きくすることはできません。あなたはそれを回避することができますが、それはあなたが本当に必要としているものではないと思います.

繰り返しなしで数を減らす場合 (たとえば、100 または 500 万、数十億未満)、次のようにする必要があります。

空から始まる一連の整数を維持します。乱数を選択します。すでにセットにある場合は、別の乱数を選択します。セットにない場合は、追加して返却してください。

そうすれば、各番号が 1 回だけ返されることが保証されます。

于 2012-07-08T08:10:44.780 に答える