循环中重复的随机数

时间:2011-06-14 13:29:46

标签: c++

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

for ( 1 to 10000)调用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;

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:6)

将种子函数调用(srand)移出函数调用之外(即,在程序开头,一次)。

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

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

答案 1 :(得分:4)

由于处理器速度很快,time(0)是相同的。只需拨打srand一次。

答案 2 :(得分:1)

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

至少应该验证三件事:

  • 只能在程序中调用srand
  • 如果多次调用srand,或者您的程序每秒运行多次,则do not use time(0) to initialize srand
  • 如果每个随机数应仅为0或1,则应调用(int)(rand() & 1)以获得从0到1的均匀分布的数字。如果您需要浮动介于0.0和1.0之间,则需要采用不同的方式。

编辑:如果您只想要一个0到1之间的随机浮点数,请参阅Generating random number between [-1, 1] in C?

答案 3 :(得分:1)

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

实际上,你根本不应该调用它,因为srand()/ rand()在许多机器上完全被破坏了。 C ++ 0x最终解决了这个问题。如果您可以使用Boost或TR1,您现在可以使用新的和改进的C ++随机数,而不必等到C ++ 0x最终成为标准,然后再等待供应商实现它。

其他替代方案(尽管没有一个是标准的一部分)是srandom()/ random()和srand48()/ drand48()。如果可用,后者形成一个很好的简单界面。 drand48()产生0到1之间的随机双精度。或者滚动你自己的。 任何比rand()更好。

答案 4 :(得分:0)

适合我:

但是当你发布代码时,你应该发布可编译的代码(否则我们猜测)。此外,通过使代码足够小以便在此处发布,您通常会发现您犯下的愚蠢错误:

#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;
}

答案 5 :(得分:0)

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

#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;