ゲーム用に作成した乱数ジェネレータの問題が発生しています。高速な擬似乱数発生器が必要です。それは暗号的に安全である必要はありません。ベクトルとシードを取り入れ、人間の検査を欺くだけのランダムなハッシュ値を与えるだけです。静的擬似乱数フィールドジェネレータ
しかし、このコードでは、2dのベクトルを与え、2でmodを計算すると「擬似乱数」の出力が得られません。ほとんどのチェッカーボードパターンが生成されます。
私はなぜ、そして正直なところ、それは知っていることが涼しいだろうが、私はそれを把握しない場合、私はそれを汗をかくことはありません。ほとんどの場合、乱数を生成するこの方法はあまりにもひどいので、私はこの問題に近づく別の方法を知りたがっています。つまり、「何が間違っているのですか」と尋ねるのではなく、このような方法で乱数を生成するための良い代替方法となるようなリソースや指針を実際に探していました。
基本的には、同じ入力を入力すると、元に戻すことができる「無限の」2Dノイズフィールド(ホワイトノイズと考える)を生成しようとしています。
私が書いたコードは、(それはfnvハッシュになっています、テンプレートの言い訳を言い訳してください。ちょっとだけコードを抜いてしまいました。
//Static random number generator, will generate a random number based off of a seed and a coordinate
template<typename T, typename... TL>
uint32_t static_random_u32(T const& d, TL const&... rest) {
return fnv_hash32(d, rest..., 2938728349u); //I'm a 32-bit prime!
}
template<typename T, typename... TL>
uint32_t fnv_hash32(T const& v, TL const&... rest) {
uint32_t hash;
fnv_hash32_init(hash);
fnv_hash32_types(hash, v, rest...);
return hash;
}
inline void fnv_hash32_init(uint32_t& hash) {
hash = 2166136279u; //another 32-bit prime
}
// Should produce predictable values regardless of endianness of architecture
template<typename T, typename... TL>
void fnv_hash32_types(uint32_t& hash, T const& v, TL const&... rest) {
#if LITTLE_ENDIAN
fnv_hash32_bytes(hash, (char*)&v, sizeof(v), true);
#else
fnv_hash32_bytes(hash, (char*)&v, sizeof(v), false);
#endif
fnv_hash32_types(hash, rest...);
}
inline void fnv_hash32_types(uint32_t& hash) {}
inline void fnv_hash32_bytes(uint32_t& hash, char const* bytes, size_t len, bool swapOrder = false) {
if (swapOrder) {
for (size_t i = len; i > 0; --i)
fnv_hash32_next(hash, bytes[i - 1]);
} else {
for (size_t i = 0; i < len; ++i)
fnv_hash32_next(hash, bytes[i]);
}
}
inline void fnv_hash32_next(uint32_t& hash, char byte) {
hash ^= byte;
hash *= 16777619u;
}
擬似乱数生成器で「フィールド」が意味するものを詳しく説明できますか? –
はい、フィールドの意味ベクトル(つまり、2次元または3次元または3次元空間の座標) – OmnipotentEntity