为了账号安全,请及时绑定邮箱和手机立即绑定

srand(time(NULL))更改种子值的速度不够快

/ 猿问

srand(time(NULL))更改种子值的速度不够快

C
慕田峪7331174 2019-12-03 16:33:17

我在C中编写了一个简单的随机数生成器。int l下限int u是上限。


它工作正常,但是我对播种有疑问。如果要以循环方式运行此代码,请time(NULL)不要足够快地更改种子值,以防止获得一系列连续的完全相同的随机数。


我想知道其他人怎么可能解决这个问题。我在网上找到的所有示例都time(NULL)用作种子价值生成器。


int generateRandom(int l, int u)

{

   srand(time(NULL));


   int r = rand() % ((u - l) + 1);

   r = l + r;


   return r;

}

如果我是紧挨着彼此碰撞的几行代码,无论是Rand1和Rand2是完全一样的。


printf("Rand1 = %d\n", generateRandom(10, 46));

printf("Rand2 = %d\n", generateRandom(10, 46));


查看完整描述

3 回答

?
白猪掌柜的

TA贡献1687条经验 获得超10个赞

srand(time(NULL))应该只运行一次以初始化PRNG。当应用程序启动时,在Main中执行此操作。


说明:


PRNG(伪随机数生成器)根据所使用的算法生成确定性的数字序列。给定的算法将始终从给定的起点(种子)产生相同的序列。如果您未明确为PRNG设置种子,那么通常每次运行应用程序时,PRNG将从相同的默认种子开始,从而导致使用相同的数字序列。


要解决此问题,您需要在每次运行应用程序时为PRNG自己添加不同的种子(以提供不同的序列)。通常的方法是使用time(NULL)根据当前时间设置种子。只要您不彼此之间在一秒钟内启动应用程序的两个实例,就可以保证使用不同的随机序列。


每次需要新的随机数时,都无需为序列设定种子。我不确定这一点,但是我有一种感觉,根据所使用的PRNG算法,对每个新数字进行重新播种实际上可能会导致结果序列中的随机性降低。


查看完整回答
反对 回复 2019-12-03
?
阿波罗的战车

TA贡献1708条经验 获得超11个赞

不要每次仅在程序开始时就对其进行播种。


另外,许多书籍建议不要使用C-lib标准随机函数。如果您需要良好的伪随机数,请在Press等人的《数字食谱》第三版中找到一个好的算法。版。


查看完整回答
反对 回复 2019-12-03
?
月关宝盒

TA贡献1682条经验 获得超6个赞

我假设您generateRandom从另一个函数main或其他函数中调用该函数。


如果在函数内部声明种子,则将重置该函数。重置功能,将使相同的数字出现几次,相同的秒。


转到srand(time(NULL));主要功能将解决此问题。


查看完整回答
反对 回复 2019-12-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信