需要为每个不同的循环生成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;
我该如何解决这个问题?
答案 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。(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;