关于一组不重复随机数的生成问题
生成一组(10个)1到100之间的随机数
srand((unsigned)time(NULL));
int i;
for (i = 0; i < 10; i++)
Memo1->Lines->Add(1+(rand()%100));
这段代码生成的还是会有少量重复,各位大大可有更好的办法? 随机数?不重复
[解决办法]
一般是这样的
int flag[100];
memset(flag, 0, 100 * sizeof(int));
int count = 0;
while ( count < 10 ) {
int value = rand() % 100;
if ( flag[value] == 0 ) {
flag[value] = 1;
count++;
}
}
int output[10];
for ( int i=0, count=0; i<100; i++ )
if ( flag[i] != 0 )
output[count++] = i;
[解决办法]
每次得到新的随机数就与已经得到的数做对比,如果有相同的就舍弃再随机一次,知道得到10个随机数,这样可以吧。
[解决办法]
你这只能过滤出重复的数,不能避免重复的。一种减小重复的方法是每次产生随机数前,都用上一个随机数做种子来初始化随机数发生器。想完全避免又让随机数之间没任何规律,那估计只有产生一个判断一个了。
[解决办法]
dataxdata 的代码没有问题的,是一个简单易行,高效的办法。
不行你可以试试。
[解决办法]
???假设一种极端的情况,第一轮的FLAG输出,只有FLAG[0] = 1,FLAG[1] ~ FLAG[9] 都是0,那第二轮只有OUTPUT[0] = 1,其余的OUTPUT都没有输出啊?我代码哪里看错了难道?
[解决办法]
1,flag的数组是0-99,不是0-9
2,在第一轮循环中 count会一直增加,直到=10, 就是说flag数组中会有10个数是大于0的
3,在第二轮循环中,循环的范围是0-99, 这样你就会从flag数组中得到10个从1-100 不重复的数,并赋值给output数组
上面的代码唯一的错误就是: output[count++] = i; 应该是 output[count++] = i+1;
因为i的范围是0-99;而题目的要求是:1-100 ;