Why does rand() yield the same sequence of numbers on every run?(为什么 rand() 每次运行都会产生相同的数字序列?)
问题描述
每次我用 rand()
运行程序时,它都会给我相同的结果.
示例:
#include #include 使用命名空间标准;int随机(int低,int高){如果(低>高)回报高;返回低 + (rand() % (高 - 低 + 1));}int main (int argc, char* argv []) {for (int i = 0; i <5; i++)cout<<随机 (2, 5) <<结束;}
输出:
35423
每次我运行程序时,它每次都会输出相同的数字.有没有办法解决这个问题?
未设置随机数生成器的种子.
如果你调用 srand((unsigned int)time(NULL))
那么你会得到更多的随机结果:
#include #include #include <ctime>使用命名空间标准;int main() {srand((unsigned int)time(NULL));cout<<兰特()<<结束;返回0;}
原因是从 rand()
函数生成的随机数实际上并不是随机的.这简直就是一种转变.维基百科对伪随机数生成器的含义给出了更好的解释:确定性随机位生成器.每次调用 rand()
时,它都会获取生成的种子和/或最后一个随机数(C 标准没有指定使用的算法,尽管 C++11 具有指定一些流行的算法),对这些数字运行数学运算,并返回结果.因此,如果种子状态每次都相同(就像您不使用真正的随机数调用 srand
一样),那么您将始终得到相同的随机"数.>
如果您想了解更多,可以阅读以下内容:
http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/
http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
Every time I run a program with rand()
it gives me the same results.
Example:
#include <iostream>
#include <cstdlib>
using namespace std;
int random (int low, int high) {
if (low > high)
return high;
return low + (rand() % (high - low + 1));
}
int main (int argc, char* argv []) {
for (int i = 0; i < 5; i++)
cout << random (2, 5) << endl;
}
Output:
3
5
4
2
3
Each time I run the program it outputs the same numbers every time. Is there a way around this?
The seed for the random number generator is not set.
If you call srand((unsigned int)time(NULL))
then you will get more random results:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
srand((unsigned int)time(NULL));
cout << rand() << endl;
return 0;
}
The reason is that a random number generated from the rand()
function isn't actually random. It simply is a transformation. Wikipedia gives a better explanation of the meaning of pseudorandom number generator: deterministic random bit generator. Every time you call rand()
it takes the seed and/or the last random number(s) generated (the C standard doesn't specify the algorithm used, though C++11 has facilities for specifying some popular algorithms), runs a mathematical operation on those numbers, and returns the result. So if the seed state is the same each time (as it is if you don't call srand
with a truly random number), then you will always get the same 'random' numbers out.
If you want to know more, you can read the following:
http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/
http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
这篇关于为什么 rand() 每次运行都会产生相同的数字序列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么 rand() 每次运行都会产生相同的数字序列?
基础教程推荐
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01