【问题标题】:Why am I getting the same results when using random numbers in a loop? [duplicate]为什么在循环中使用随机数时会得到相同的结果? [复制]
【发布时间】:2014-08-22 12:50:33
【问题描述】:

我可能是个盲人,尽管我使用了随机数,但每次运行此控制台应用程序时都会得到相同的结果。任何人都可以解释我要去哪里错了吗?代码如下:

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;

bool bacteria(long mut, long chance){
        bool result;
    if (mut >= chance){
         result = true;
    }
    else{
        result = false;
    }
    return result;
}
int run = 1000000;//Number of iterations
int mutations;
int survival;

void domutation(){
    mutations = 0;
    survival = 0;
    for (int i = 0; i < run; i++){
        long x = rand() % 2;
        long y = rand() % 1000000;
        bool run = bacteria(x, y);
        if (run == true){
            mutations++;
        }
        else if (run == false) {
            survival++;
        }
    }
    cout << "Mutations: " << mutations << "   Survivals: " << survival << endl;
}

int main(){
    for (int x = 0; x < 10; x++){
        domutation();
    }
    int wait;
    cin >> wait;
}

domutation() 的每次单独迭代都会产生与前一次迭代不同的结果,但每次我运行应用程序时,结果总是与我上次运行它时的结果相同,例如第一次迭代总是产生 38 个突变,最后一次总是产生 52 个,中间的所有变化都没有变化。

我确定我在做一些愚蠢的事情!

我在 Windows 8.1 的 VS 2013 中工作。

谢谢!

【问题讨论】:

  • “尽管使用随机数”使用随机数。您使用的是伪随机数。
  • 您应该使用 C++11 &lt;random&gt; 标头。
  • 你没有播种随机数生成器
  • 使用 srand(time(NULL)) 作为主文件的第一行。每次运行程序时,您都有相同的种子。相同的种子 - 相同的生成数字
  • 太好了,成功了,谢谢。我知道这将是显而易见的事情。我对伪随机数有不同的(因此是不正确的)理解。谢谢大家。

标签: c++ loops random visual-studio-2013 windows-8.1


【解决方案1】:

rand 为您提供可预测的数字流。您需要为其播种以选择此流中的不同点来启动。假设您每秒运行程序的次数不会超过一次,那么当前时间是一个便宜/容易的种子。

int main(){
    srand(time(NULL));
    for (int x = 0; x < 10; x++){
        domutation();
    }

请注意,不提供种子等同于始终以srand(0) 启动程序

【讨论】:

  • 非常感谢。我对伪随机数有错误的理解。这次真是万分感谢。如果我想每秒运行一次以上的模拟,我该怎么办?我不知道,但我很好奇......
  • @GuyStimpson 你需要找到一个每秒改变不止一次的种子。例如。 gettimeofday 提供微秒级分辨率。
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多