게임용으로 작성한 난수 생성기에 문제가 있습니다. 빠른 pseudorandom 필드 생성기가 필요합니다. 암호로 보호 할 필요는 없으며 단지 벡터와 시드를 가져 와서 사람의 검열을 속일 정도로 충분히 해시 값을 부여하면됩니다.정적 의사 랜덤 필드 생성기
그러나이 코드는 2 차원 벡터를 제공하고 결과를 2로 수정할 때 "의사 난수"출력을 생성하지 못합니다. 대부분 바둑판 패턴을 생성합니다.
나는 왜, 그리고 솔직히, 그것은 알고있는 것이 멋질 것입니다. 그러나 결코 그것을 이해하지 못하면 나는 그것을 땀꿀 것입니다. 대부분, 난 그냥 임의의 숫자를 생성하는이 방법은 너무 끔찍한 생각, 그래서이 문제를 접근하는 대체 방법을 알고 싶었어요. 즉, 나는 "내가 뭘 잘못하고 있니?"라고 묻는 대신에 이런 방식으로 난수를 생성하는 좋은 대체 방법이 무엇인지에 대한 자료 나 조언을 찾고있었습니다.
기본적으로 동일한 입력을 입력하면 기본적으로 "무한"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 차원 또는 3D 또는 nd 공간의 좌표) – OmnipotentEntity