循环中重复的随机数
Repeated random number in a loop
需要为每个不同的循环生成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;
- 程序在尝试猜测它选择的随机数时进入无限循环?
- C++ - 如何保持半随机数组在循环中排序
- C ++初学者使用while循环生成随机数
- 在C++中创建随机数矩阵,无需循环
- 在 loop_C++ 中生成随机数,并在循环中生成数组 (OpenMP)
- C++生成多个随机数而不循环
- 而循环.出现随机数
- 本应生成 2 个介于 1 和 9 之间的随机数的程序C++只生成 6 和 9 并且没有正确循环
- 用循环生成随机数
- 简单循环不适用于随机数
- 当被要求使用随机数生成器时,C++程序在while循环中崩溃
- C++循环中调用伪随机数生成器函数 - 常量种子问题
- C++循环的随机数生成器
- 将随机数插入到数组中,其中每个值都是通过 for 循环输入的
- file.get()在循环C++后返回随机数
- 每次循环迭代都有相同的随机数
- 生成均匀分布的随机数(在循环中获得相同的数字)
- 为什么我在循环中使用随机数时得到相同的结果
- 使用for循环和rand生成100个随机数,并打印出最小和最大的数字
- 我能让我的while循环在每次循环时创建一个新的随机数吗