我搜索了高低版本的一种函数来转换这段代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void ran(int array[], int max);
int main() {
printf("Today's lottery numbers are:\n");
for (int i = 0; i < 6; i++)
srand((unsigned)(NULL));
}
进入随机数生成器,确保没有重复的数字可以帮助我吗?检查后我打算用printf("%d\n", rand()%50);
我只需要一个确保其不重复的例行程序。如果你能给我一个例程,我会非常放心,并一定会付出代价。
感谢。这些库似乎没有在这个scren上正确读取,但它们是stdio,stdlib和time以及我使用命名空间。
答案 0 :(得分:3)
为什么不使用STL中已有的内容?查看您的示例代码,并假设它有点代表您想要做的事情,一切都应该在那里。 (我假设您需要一个相对较小的数字范围,因此内存不会成为约束)
使用std::random_shuffle
和包含您希望数字所在范围内的整数的std::vector
,应该为您提供示例代码中所需的一系列唯一随机数。
在使用std::random_shuffle
之前,您仍然需要调用一次srand,而且只调用一次。不像您在当前的代码示例中那样多次。
答案 1 :(得分:2)
您只应在代码中调用srand
一次,然后使用time(NULL)
等“随机”种子调用它。
通过在循环中调用srand
,并且每次使用0种子调用它,您将获得完全相同的六个数字。
但是,即使有这些修正,rand()%50
也可能会给您两次相同的号码。你应该使用的是#{3}}之类的随机算法,因为它与彩票机完全相同。
这是一个完整的程序,显示实际操作:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static void getSix (int *dst) {
int sz, pos, i, src[50];
for (i = 0; i < sizeof(src)/sizeof(*src); i++)
src[i] = i + 1;
sz = 50;
for (i = 0; i < 6; i++) {
pos = rand() % sz;
dst[i] = src[pos];
src[pos] = src[sz-1];
sz--;
}
}
int main (void) {
srand (time (NULL));
int i, numbers[6];
getSix (numbers);
printf ("Numbers are:\n");
for (i = 0; i < sizeof(numbers)/sizeof(*numbers); i++)
printf (" %d\n", numbers[i]);
return 0;
}
样品运行:
Numbers are:
25
10
26
4
18
1
Numbers are:
39
45
8
18
17
22
Numbers are:
8
6
49
21
40
28
Numbers are:
37
49
45
43
6
40
答案 2 :(得分:2)
如果您的随机数范围有限而且很小,则说您有X
个不同的数字。
I
之间选择一个随机索引X
,并获取其值X
值移至I
位置答案 3 :(得分:1)
我建议使用更好的随机数生成算法,该算法可以在内部提供,而不是使用rand。
rand()
并试图阻止重复的问题是,找到一个未使用的号码会因每个号码添加到使用的列表而变慢,最终成为一个很长的查找和丢弃号码的过程。
如果您要使用更复杂的伪随机数生成器(并且有许多可用,请检查Boost等),您将有更轻松的时间,并且可以完全避免重复。这取决于算法,因此您需要查看文档。
要在不使用任何其他库的情况下执行此操作,您可以使用顺序(或甚至随机)数字预填充矢量或列表,确保每个数字在列表中出现一次。然后,要生成一个数字,请生成一个随机数,然后从列表中选择(并删除)该项。通过删除每个项目,只要每个项目一旦开始存在,您就永远不会遇到重复。
答案 4 :(得分:0)
如果您有权访问C ++ 0x,您可以使用新的随机生成器工具为您包装所有这些垃圾!