为什么c++中的rand()函数不是真正随机的
Why rand() function in c++ is not truly random
我做了一个非常简单的随机函数,我把结果保存在一个文件中。我用这个程序创建了两个不同的文件,其中的信息是完全相同的。为什么会发生这种情况?
下面是我的简单程序: #include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
int main()
{
ofstream myfile;
int k;
myfile.open ("2.txt");
for(int i = 0; i < 50000000; i++){
k = rand() % 2;
myfile << k;
}
myfile.close();
}
rand()
每次都会以相同的模式生成相同的数字,除非您先播种它。如果你想使用srand
:
srand(5);
rand();
srand(10);
rand(); //will still produce a consistent pattern, but different from rand() seeded with 5
如果您正在寻找更真正随机的东西,请尝试调用srand
与您的系统日期/时间或查看随机头,如果您的编译器有c++ 11支持。
计算机是确定性的。我们相信那个事实。
因此rand
函数是确定性的
在日常编程中,我们使用的随机函数通常是伪随机数生成器。这意味着生成的结果匹配随机分布(出局的机会均匀分布),但总是在相同的"种子"上生成相同的结果
详情请参阅http://en.wikipedia.org/wiki/Pseudorandomness
有真正的随机模拟,如http://en.wikipedia.org/wiki/Monte_Carlo_method实现真正的随机,如果需要更严肃的任务。
如果你希望你的结果是随机的,你应该每次都给你的随机函数分配一个不同的"种子",比如使用当前日期和时间。
关于"种子"的更多信息,请阅读http://en.wikipedia.org/wiki/Random_seed
如果你只是需要一个相当好的随机生成器—-例如让事物在游戏中显得随机—-你可以使用经典的"线性一致性生成器",它很容易编写并产生相当随机的输出。
LCG发生器:
int seed = 0x533;//任意数
int random() {seed = (seed * 79069) + 1;返回的种子;}
编辑: srand()就是你要找的,他比我先找到了
- 循环中的随机函数
- 如何调用随机函数
- 如何在 C++ 中获取随机函数的周期性
- C++ Arduino - 随机函数不起作用
- 随机函数在循环中调用时返回相同的数字!C++
- C++随机函数给出的相同整数是输出的两倍
- C++编写随机函数和参数
- 在另一个函数中调用随机函数
- 如何在另一种语言的随机函数中复制C++兰特?
- C++中的随机函数
- 在RFC3711(SRTP)中,OpenSSL AES_ctr128_encrypt()作为密钥派生的伪随机函数意外输出
- 值噪声随机函数奇异输出
- 每次在 c++ 中调用的随机函数
- 是否有一个随机函数可以生成 0 到 1 之间的数字
- 调用随机函数 (C++)
- 具有内部随机函数的结构的CUDA移植
- 以给定概率生成1或0的随机函数
- 随机函数在c++和Matlab中
- 实现自己的随机函数是否被普遍接受?(c++)
- C++从随机函数中移除元素