私はC#のシードに基づいて数値を生成しようとしています。唯一の問題は、シードが大きすぎてint32にならないことです。私は種子として長く使うことができる方法はありますか?C#Random(Long)
はい、シードは長い必要があります。
私はC#のシードに基づいて数値を生成しようとしています。唯一の問題は、シードが大きすぎてint32にならないことです。私は種子として長く使うことができる方法はありますか?C#Random(Long)
はい、シードは長い必要があります。
私がfrom the Java Specificationを移植したJava.Util.Random
のCバージョンです。
最高のことは、Javaプログラムを作成して数値のロードを生成し、このC#バージョンが同じ数を生成することを確認することです。それは乱数を生成する必要があるコードにアクセス可能です。この機能を入れRandom number in long range, is this the way?
::私は@Dypplによってここで提供答えのために行くだろう
public sealed class JavaRng
{
public JavaRng(long seed)
{
_seed = (seed^LARGE_PRIME) & ((1L << 48) - 1);
}
public int NextInt(int n)
{
if (n <= 0)
throw new ArgumentOutOfRangeException("n", n, "n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do
{
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
return val;
}
private int next(int bits)
{
_seed = (_seed*LARGE_PRIME + SMALL_PRIME) & ((1L << 48) - 1);
return (int) (((uint)_seed) >> (48 - bits));
}
private long _seed;
private const long LARGE_PRIME = 0x5DEECE66DL;
private const long SMALL_PRIME = 0xBL;
}
long LongRandom(long min, long max, Random rand)
{
byte[] buf = new byte[8];
rand.NextBytes(buf);
long longRand = BitConverter.ToInt64(buf, 0);
return (Math.Abs(longRand % (max - min)) + min);
}
その後
long r = LongRandom(100000000000000000, 100000000000000050, new Random());
LongRandom(long.MinValue、long.MaxValue、new Random())は常に-9223372036854775808を返します。いずれの場合でも、 .Abs()は1ビットを破壊し、63個のランダムビットを残します。63個のランダムビットしか持たない場合、64ビットの乱数は提供できません。 –
なぜシード*が長くてはならないのか説明してください。 :)間違ったやり方で何かしようとしているようです。 – J0HN
擬似乱数に長いシードが必要なのはなぜですか? – tomsv
@ J0HNミネクラフトでスライムが出現する場所を計算しています。 – user1599078