srand(time(NULL)) doesn't change seed value quick enough
我在C语言中编写了一个简单的随机数生成器。int l是下界,int u是上限。
它工作正常,但是我对播种有疑问。 如果我要循环运行此代码,则time(NULL)不会足够快地更改种子值,从而无法防止获得一系列连续的完全相同的随机数。
我想知道其他人怎么可能解决这个问题。 我在网上找到的所有示例都使用time(NULL)作为种子值生成器。
1 2 3 4 5 6 7 8 9
| int generateRandom (int l , int u )
{
srand(time(NULL ));
int r = rand() % ((u - l ) + 1);
r = l + r ;
return r ;
} |
如果我要紧挨着运行这些代码行,则Rand1和Rand2将会完全相同。
1 2 3 4
| printf("Rand1 = %d
", generateRandom (10, 46));
printf("Rand2 = %d
", generateRandom (10, 46)); |
-
啊! 不要给变量命名简单的l! 更喜欢lb,lower,lowerbound,...
srand(time(NULL))应该只运行一次以初始化PRNG。当应用程序启动时,在Main中执行此操作。
说明:
PRNG(伪随机数生成器)根据所使用的算法生成确定性的数字序列。给定的算法将始终从给定的起点(种子)产生相同的序列。如果您未明确为PRNG设置种子,那么通常每次运行应用程序时,PRNG将从相同的默认种子开始,从而导致使用相同的数字序列。
要解决此问题,您需要在每次运行应用程序时为PRNG自己添加不同的种子(以提供不同的序列)。通常的方法是使用time(NULL),它根据当前时间设置种子。只要您不彼此之间在一秒钟内启动应用程序的两个实例,就可以保证使用不同的随机序列。
每次需要新的随机数时,都无需为序列设定种子。我不确定这一点,但是我有一种感觉,根据所使用的PRNG算法,对每个新数字进行重新播种实际上可能会导致结果序列中的随机性降低。
-
至少,即使播种没有受到伤害,播种对质量也无济于事。 至少每次从time(NULL)进行播种时,它都可以这样做。
主要开始时播种一次。如果您在同一秒内播种的速度太快,最终将得到相同的数字。
srand( (unsigned) time(NULL) * getpid());
产生更多样化的随机集(在OSX 10.8上),包括在短周期测试中。
-
如果您使用的是OS X 10.8,并且关心随机性,则应使用arc4random()或arc4random_uniform()。
不要每次仅在程序开始时就对其进行播种。
另外,许多书籍建议不要使用C-lib标准随机函数。如果您需要良好的伪随机数,请在Press等人的《数字食谱》第三版中找到一个好的算法。版。
-
不过请注意NR,本书中代码的许可条款非常繁琐,如果您键入它,则我基本上禁止任何版本控制或网络文件存储的版本!
我假设您从另一个函数main或其他函数调用generateRandom函数。
如果在函数内部声明种子,则将重置该函数。重置功能,将使相同的数字出现几次,相同的秒。
将srand(time(NULL));移至主要功能将解决此问题。
如果您使用其他进程,请使用(rand()+getpid())%range;
我用它每秒测试多次带有随机值的相同程序(如果您输入rand编号,请退出该程序并再次快速运行,那么编号将相同)