C ++随机数生成器,不重复数字

时间:2010-11-06 00:31:04

标签: c++ visual-c++

我搜索了高低版本的一种函数来转换这段代码

#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以及我使用命名空间。

5 个答案:

答案 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个不同的数字。

  • 使用每个数字创建一个数组
  • 在0和I之间选择一个随机索引X,并获取其值
  • X值移至I位置
  • 减少X并重复

答案 3 :(得分:1)

我建议使用更好的随机数生成算法,该算法可以在内部提供,而不是使用rand。

rand()并试图阻止重复的问题是,找到一个未使用的号码会因每个号码添加到使用的列表而变慢,最终成为一个很长的查找和丢弃号码的过程。

如果您要使用更复杂的伪随机数生成器(并且有许多可用,请检查Boost等),您将有更轻松的时间,并且可以完全避免重复。这取决于算法,因此您需要查看文档。

要在不使用任何其他库的情况下执行此操作,您可以使用顺序(或甚至随机)数字预填充矢量或列表,确保每个数字在列表中出现一次。然后,要生成一个数字,请生成一个随机数,然后从列表中选择(并删除)该项。通过删除每个项目,只要每个项目一旦开始存在,您就永远不会遇到重复。

答案 4 :(得分:0)

如果您有权访问C ++ 0x,您可以使用新的随机生成器工具为您包装所有这些垃圾!

http://www2.research.att.com/~bs/C++0xFAQ.html#std-random