gpt4 book ai didi

c++ - 随机但可预测的数字生成器? [C++]

转载 作者:太空狗 更新时间:2023-10-29 20:06:09 24 4
gpt4 key购买 nike

嗯,我真的不知道如何搜索我要找的东西。Google 给出了大量结果,但没有一个符合我的标准。

所以我在这里问:是否有任何已知的代码片段可以创建一个数字,该数字是可预测的、看起来是随机的,并且基于“种子”(在我的例子中是 unix 时间戳)并且在指定范围内?

我希望能够在我正在编写的游戏的脚本中创建天气预报(但我需要我可以移植的 C++ 代码,我认为这里的很多人都不熟悉“PAWN”[又名SMALL] 脚本语言?:))。天气 ID 从 0 到 ~100 不等,包括一些已弃用的 ID(所以我的解决方案是制作一个包含有效天气 ID 的数组,这样我们就不需要担心那些 BAD_ID,我们不要让函数太复杂)。

我可能会做出这样的公式,但过去我遇到的问题是天气变化太快(就像每一秒一样,虽然我在某处丢失了代码:/)现在我真的没有想法我将如何制作这样的公式。

任何建议也非常感谢!

最佳答案

查看 random number generator used by VB6 的 C 实现.它非常适合游戏,因为它会生成相当可信的随机序列,但使用种子并且相同的种子总是生成相同的序列。因此,在游戏数据文件中,您可以保存一组种子值,这些种子值将为您提供可以轻松重现的已知(但看起来随机)的序列。

这是一个返回范围内值的实现:

typedef int Int32;
typedef unsigned int UInt32;

class CRnd
{
private:
static const UInt32 INITIAL_VALUE = 0x50000;
static const UInt32 INCREMENT = 0xC39EC3;
static const UInt32 MULTIPLIER = 0x43FD43FD;

private:
UInt32 m_nRnd;

public:
CRnd () { m_nRnd = INITIAL_VALUE; };
CRnd ( IN UInt32 nSeed ) { m_nRnd = nSeed; };
virtual ~CRnd () {};

Int32 Get ( IN Int32 nFrom, IN Int32 nTo )
{
if ( nTo < nFrom ) // nFrom should be less than nTo
{
Int32 nTmp = nTo;

nTo = nFrom;
nFrom = nTmp;
}
else if ( nTo == nFrom )
{
return ( nTo );
}

m_nRnd = ( m_nRnd * MULTIPLIER + INCREMENT ) & 0xFFFFFF;

float fTmp = (float) m_nRnd / (float) 16777216.0;

return ( (Int32) ( ( fTmp * ( nTo - nFrom + 1 ) ) + nFrom ) );
};

void SetSeed ( IN UInt32 nSeed ) { m_nRnd = nSeed; };
UInt32 GetSeed () { return ( m_nRnd ); };
};

关于c++ - 随机但可预测的数字生成器? [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9269430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com