为什么c++中的rand()函数不是真正随机的

Why rand() function in c++ is not truly random

本文关键字:随机 函数 中的 c++ rand 为什么      更新时间:2023-10-16

我做了一个非常简单的随机函数,我把结果保存在一个文件中。我用这个程序创建了两个不同的文件,其中的信息是完全相同的。为什么会发生这种情况?

下面是我的简单程序:
 #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()就是你要找的,他比我先找到了