srand
とrand
に問題が唯一そのコール署名(およびいない、彼らは発生値)C規格によって決定されることです。移植性のあると確定擬似乱数が必要な場合は、自分で実装する必要があります。 C++で書かれたクラスは、数値レシピにあるクラスに基づいており、完全に移植可能です。必要に応じて乱数ストリームをシードでインスタンス化することができます。同じ擬似ランダムシーケンスを何度も繰り返す必要がある場合に備えて、このシードをハードコードします。 RandomInteger(a,b)
メソッドを使用して、ハーフオープン間隔[a、b]に整数を取得することもできます。
class RandomNumberStream
{
private:
unsigned long long u,v,w;
public:
RandomNumberStream(int n=1);
double RandomDouble();
double RandomDouble(double a, double b);
unsigned long long RandomInteger();
unsigned long long RandomInteger(int a, int b);
private:
unsigned long long int64();
} ;
RandomNumberStream::RandomNumberStream(int n)
{
v = 4101842887655102017LL;
w = 1;
u = n^v; int64();
v = u; int64();
w = v; int64();
}
double RandomNumberStream::RandomDouble()
{
return int64() * 5.42101086242752217E-20f;
}
double RandomNumberStream::RandomDouble(double a, double b)
{
return int64() * 5.42101086242752217E-20f * (b-a) + a;
}
unsigned long long RandomNumberStream::RandomInteger()
{
return int64();
}
unsigned long long RandomNumberStream::RandomInteger(int a, int b)
{
return a + int64() % (b-a);
}
unsigned long long RandomNumberStream::int64()
{
u = u * 2862933555777941757LL + 7046029254386353087LL;
v ^= v>>17; v ^= v<<31; v ^= v>>8;
w = 4294957665U*(w & 0xffffffff) + (w>>32);
unsigned long long x = u^(u<<21); x ^= x>>35; x ^= x<<4;
return (x+v)^w;
}
[Boost.Random](http://www.boost.org/libs/random/)をご覧ください。 – ildjarn
あなたの天気が急激に変化している場合、解決策はランダムなジェネレータを取得することではなく、別のパターンをあまり頻繁に選択しないことです。 「Sun」と「Snowstorm」のIDが互いに隣り合っていれば、それは役に立ちません。 –
多くのコードを移植する必要のないrandom()関数がありますか? (PHP、PAWN、C++ < - それはブーストですが、PAWNとPHP ...特にPAWN) –