循环中重复的随机数

Repeated random number in a loop

本文关键字:随机数 循环      更新时间:2023-10-16

需要为每个不同的循环生成0到1之间的随机数。

CCD_ 1调用RandomKey函数以生成不同的随机数。但问题是每次迭代我都得到相同的数字。

RandomKey函数如下:

 void RandomKey ()
 {
   srand((unsigned)time(0));
   for (int k=0;k<ActivityNumber;k++)
 {
Act_num[k].Priority=(rand()%10000)*0.0001;//random number
 }

for (int i=0;i<ActivityNumber;i++)
   arr[i]=Act_num[i].Priority;

我该如何解决这个问题?

将种子函数调用(srand)移动到函数调用之外(即在程序开始时移动一次)。

编辑:进一步思考,如果你的意思是你在arr中得到所有0(如果说…int),那是因为rand()%10000)*0.0001返回一个介于0和0.0003之间的数字,所以如果你把它们投射到int,你会得到0。

第2版:没关系,我第一次似乎猜对了:)

由于处理器速度快,time(0)也一样。只调用srand一次。

(我在这里重述其他建议。)

至少有三件事你应该验证:

  • 在程序中只调用srand一次
  • 如果for ( 1 to 10000)0被调用多次,或者您的程序每秒运行多次,则不要使用时间(0)初始化srand
  • 如果每个随机数应该只有0或1,那么您应该调用(int)(rand() & 1)来获得从0到1的均匀分布数。如果需要在0.0和1.0之间浮动,则需要以不同的方式执行

编辑:如果您只想要一个介于0和1之间的随机浮点数,请参阅在C中生成[-1,1]之间的随机数?

在程序运行的整个过程中,您应该调用srand()一次,而且只能调用一次。

实际上,您根本不应该调用它,因为srand()/rand()在许多机器上都完全崩溃了。C++0x最终修复了这个漏洞。如果你可以使用Boost或TR1,你现在就可以使用新的和改进的C++随机数,而不必等到C++0x最终成为标准,然后等待更长的时间等待供应商来实现它。

其他替代方案(尽管没有一个是标准的一部分)是srandom()/randm()和srand48()/drand48()。后者(如果有的话)形成了一个很好的简单界面。drand48()生成一个介于0和1之间的随机双精度。或者自己滚任何东西都比rand()好。

适用于我:

但是当您发布代码时,您应该发布可编译的代码(否则我们会猜测)。同样,通过使代码小到可以发布在这里,你通常会发现你犯的愚蠢错误:

#include <time.h>
#include <stdlib.h>
#include <algorithm>
#include <iterator>
#include <iostream>
int const iterationnumber = 5;
int const ActivityNumber  = 5;
double arr[5];                          // HERE is probably your mistake (double not int)
struct { double Priority; } Act_num[5]; // OR HERE make sure Priority is a double
void RandomKey();
int main ()
{
    srand((unsigned)time(0));
    for (int k=0;k<iterationnumber;k++)
    {
        RandomKey ();//i call randomkey for every iteration
        std::copy(&arr[0], &arr[ActivityNumber], std::ostream_iterator<double>(std::cout, " "));
        std::cout << "n";
    }
}
void RandomKey ()
{
    for (int k=0;k<ActivityNumber;k++)
    {
        Act_num[k].Priority=(rand()%10000)*0.0001;//random number
    }
    for (int i=0;i<ActivityNumber;i++)
        arr[i] = Act_num[i].Priority;
}

此代码只生成一次唯一的随机数。

#include <ctime>
# include <iostream>
using namespace std;

int main()
{
      int size=100;
      int random_once[100];
      srand(time(0));
      for (int i=0;i<size;i++)  // generate unique random number only once
      {
          random_once[i]=rand() % size;
          for(int j=0;j<i;j++) if (random_once[j]==random_once[i]) i--;   
      }
      for ( i=0;i<size;i++) cout<<" "<<random_once[i]<<"t";
  return 0;