0

当我再次运行可执行文件时,我正在制作一个函数来生成不同的随机值。这是我制作位 0 和 1 的函数。第一次,我运行它并得到输出是 0 1 1 1。我运行 .exe 输出与之前的相同。怎么了?当我再次运行时,我想要不同的输出。你能帮助我吗?

int randBit()
{
    int bit;
    double randval;
    randval = (double)rand()/(double)RAND_MAX;
    if(randval<0.5) bit=0;
    else bit=1;
    return bit;
}
4

5 回答 5

4

这是使用<random>标头的解决方案。

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> dist (0,1);
int random_number = dist(mt);

dist(mt)每次需要新的随机数时调用。

于 2013-11-06T12:56:11.223 回答
2

您需要srandmain 中的函数。

随时间播种:

  #include <time.h> //header for time

  int main(){
       srand(time(NULL)); // call only once and preferably at the start of main 

       // your code including the function randBit()

       return 0;
 }

这是一个示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int randBit()
{
   int bit;
   double randval;
   randval = (double)rand()/(double)RAND_MAX;
   if(randval<0.5) bit=0;
   else bit=1;
   return bit;
}

int main(){

      srand(time(NULL));
      int i=0,random=0;

      for(i=0;i<100;i++){
            random = randBit();
            printf("%d ",random);
      }

      printf("\n");  
      return 0;
}

这是输出:

Notra:Desktop Sukhvir$ ./test

1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1

于 2013-11-06T12:41:20.930 回答
0

从手册页:

rand() 函数返回 0 到 RAND_MAX 范围内的伪随机整数。

这意味着它rand实际上不会在每次调用时生成随机值,而是将种子作为初始值并基于该种子生成伪随机值。使用特定的种子,每个调用序列都rand()将提供相同的“随机”数字序列。

种子可以使用该srand()函数进行初始化,并且在每次执行中使用不同的生成数字序列的一个好方法是将其time(NULL)用作种子。

请注意,您只需要初始化一次种子,因此您可以决定在main程序的函数中执行此操作。

干杯。

于 2013-11-06T13:18:02.147 回答
0

C 中的rand()函数是伪随机的,因此它需要一个种子。这个种子可以是任何数字,但通常是当前时间、传感器数据或其他任何难以预测的东西。

种子有一个默认值,每次运行程序时都会产生相同的“随机”数字序列。要设置种子,您可以使用该srand()功能,例如srand(time(NULL))使用当前时间作为种子。随机值是从种子中计算出来的,因此rand()在每次调用时都会根据前一次计算一个新值。

于 2013-11-06T14:00:10.957 回答
0

你需要在第一次打电话srand()之前rand()打电话。对于 Windows,您可以使用:

srand( GetTickCount() );

和平台无关的变体:

srand( time(NULL) );
于 2013-11-06T12:37:28.207 回答