概述
// vs 2008
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
int arr[10] = {0} ;
for (int i = 0 ;i < 10 ;i++)
{
srand(time(NULL)) ; // 产生随机种子
arr[i] = rand() ; // 产生随机数
}//for
return 0;
}
问题:
看到了么, 全都是一个数字!
问题出现在 '产生随机种子' 的那一行. srand 是根据当前时间来得到一个随机数的基础值, 以后调用 rand 产生的随机值都是根据基础值计算得出. 也就是说, 同一个基础值一定会得到同一个随机值.
现在问题很明了了, 就是因为 CPU 速度太快, 导致 for 循环执行 10 次所用的时间对于 time 函数来说产生异样的结果. 因此调用 rand 产生的结果必然一样.
解决方案:
- 如果在一个函数内做随机值的所有任务(即 srand 和 rand), 那么可以将 srand 放在 for 循环外.
- 如果 srand 和 rand 会被执行多次, 那么可以设置一个无用的全局变量, 为的是执行 srand(time(NULL)):
int g_unused = (srand(time(NULL)), 0) ; // Generate a seed for 'rand' in whole program.
int main()
{
...
}
(因为 srand 是以 void 为返回值, 所以不得不使用逗号表达式来给全局变量赋值.)
转载于:https://www.cnblogs.com/walfud/articles/2190574.html
最后
以上就是坚定仙人掌为你收集整理的多次调用 srand 引起 rand 产生同一随机数的全部内容,希望文章能够帮你解决多次调用 srand 引起 rand 产生同一随机数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复