Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使随机数唯一_C++ - Fatal编程技术网

C++ 如何使随机数唯一

C++ 如何使随机数唯一,c++,C++,我正在做一个随机数发生器。它询问用户希望数字中包含多少位数。例如,如果输入2,将生成10到99之间的随机数。我已经制作了生成器,但我的问题是数字不是唯一的 这是我的密码。我不知道为什么它不生成唯一的数字。我认为srand(time(null))可以做到这一点 void TargetGen::randomNumberGen() { srand (time(NULL)); if (intLength == 1) { for (int i = 0; i< intQuantity; i+

我正在做一个随机数发生器。它询问用户希望数字中包含多少位数。例如,如果输入2,将生成10到99之间的随机数。我已经制作了生成器,但我的问题是数字不是唯一的

这是我的密码。我不知道为什么它不生成唯一的数字。我认为srand(time(null))可以做到这一点

void TargetGen::randomNumberGen()
{
srand (time(NULL));
if (intLength == 1)
{

    for (int i = 0; i< intQuantity; i++)
    {
        int min = 1;
        int max = 9;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";

    }

}
else if (intLength == 2)
{
    for (int i = 0; i<intQuantity; i++)
    {
        int min = 10;
        int max = 90;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";


    }

}

if (intLength == 3)
{
    for (int i = 0; i<intQuantity; i++)
    {
        int min = 100;
        int max = 900;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";
    }

}
else if (intLength == 4)
{
    for (int i = 0; i<intQuantity; i++)
    {
        int min = 1000;
        int max = 9000;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";
    }

}

if (intLength == 5)
{
    for (int i = 0; i<intQuantity; i++)
    {
        int min = 10000;
        int max = 90000;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";
    }

}
else if (intLength == 6)
{

    for (int i = 0; i<intQuantity; i++)
    {
        int min = 100000;
        int max = 900000;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";


    }

}

if (intLength == 7)
{
    for (int i = 0; i<intQuantity; i++)
    {
        int min = 1000000;
        int max = 9000000;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";
    }

}
else if (intLength == 8)
{
    for (int i = 0; i <intQuantity; i++)
    {
        int min = 10000000;
        int max = 89999999;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";
    }

}

if (intLength == 9)
{
    for (int i = 0; i < intQuantity; i++)
    {
        int min = 100000000;
        int max = 900000000;
        int number1 = rand();

        if (intQuantity > max)
        {
            intQuantity = max;
        }

        cout << number1 % max + min << "\t";
    }

}
}
void TargetGen::randomNumberGen()
{
srand(时间(空));
if(intLength==1)
{
对于(int i=0;i最大值)
{
intQuantity=max;
}

cout这里有两种可能的方法来生成一个范围内的唯一随机数

  • 跟踪已使用
    std::set
    生成的数字,并丢弃和重新生成已在集中的数字。由于生日悖论,如果要生成大量随机数字,不建议使用这种方法
  • 生成给定范围内的所有数字,对它们进行随机排列,然后输出用户想要的数量

  • 这里有两种可能的方法来生成一个范围内的唯一随机数

  • 跟踪已使用
    std::set
    生成的数字,并丢弃和重新生成已在集中的数字。由于生日悖论,如果要生成大量随机数字,不建议使用这种方法
  • 生成给定范围内的所有数字,对它们进行随机排列,然后输出用户想要的数量

  • 标准随机生成器永远不会生成唯一的数字,在这种情况下,它们不会是独立的

    要生成唯一号码,您必须:

    • 保存生成的所有编号,并将新编号与旧编号进行比较(如果存在一致性)-重新生成

    • 使用random_shuffle函数:提前获取所有序列

    标准随机生成器永远不会生成唯一的数字,在这种情况下,它们不会是独立的

    要生成唯一号码,您必须:

    • 保存生成的所有编号,并将新编号与旧编号进行比较(如果存在一致性)-重新生成

    • 使用random_shuffle函数:提前获取所有序列

    我假设您可以想出一种方法来计算您要使用多少个数字。这非常简单,因为用户输入2到10-99,3到100-999,等等

    如果您想自己实现唯一的、随机生成的数字,请查看这些链接

    下面是一个非常类似的实现:

    本质上,您正在创建一个由X个整数组成的数组,所有整数都设置为其索引的值。您可以随机选择一个介于0和MAX之间的索引,取该索引处的值,并将其与MAX值交换。MAX随后递减1,您可以通过随机选择介于0和MAX-1之间的索引来重复此操作


    这将为您提供一个由0-999个整数组成的无重复的随机数组。

    我假设您可以想出一种方法来计算您要使用多少个数字。这非常简单,因为用户输入2到10-99,3是100-999,等等

    如果您想自己实现唯一的、随机生成的数字,请查看这些链接

    下面是一个非常类似的实现:

    本质上,您正在创建一个由X个整数组成的数组,所有整数都设置为其索引的值。您可以随机选择一个介于0和MAX之间的索引,取该索引处的值,并将其与MAX值交换。MAX随后递减1,您可以通过随机选择介于0和MAX-1之间的索引来重复此操作


    这将为您提供一个由0-999个整数组成的无重复的随机数组。

    每个人都对随机数有着有趣的期望——显然,您期望随机数是唯一的!如果您使用任何好的随机数生成器,您的随机数将永远无法保证是唯一的

    为了使这一点最为明显,如果您想生成[1,2]范围内的随机数,并且要生成两个数字,您(通常期望)将以相同的概率获得以下四种可能性之一:

    1,2
    2,1
    1,1
    2,2

    要求一个好的随机数生成器生成前两个而不是后两个是没有意义的

    现在,花一点时间想想,如果你要求在相同的范围内生成三个数字,会发生什么…1,2,然后呢

    因此,唯一性不是,也不会是随机数生成器的属性

    但是,您的特定问题可能需要唯一性。在这种情况下,您需要做一些额外的工作来确保唯一性

    一种方法是保留一个标签,上面有已经选择的数字。您可以将它们保留在一个集合中,如果您之前已经选择了一个,则可以重新选择。但是,只有当您选择一组与您的范围相比较小的数字时,此方法才有效;如果您选择了大部分范围,则此过程的结束将无效


    如果要拾取的数字计数对应于范围的大部分,则使用范围的数组,并使用良好的洗牌算法来洗牌周围的数字是一个更好的解决方案

    每个人都对随机数有着有趣的期望——显然,你期望随机数是唯一的!如果你使用任何好的随机数生成器,你的随机数将永远无法保证是唯一的

    为了使这一点最为明显,如果您想生成[1,2]范围内的随机数,并且要生成两个数字,您(通常期望)将以相同的概率获得以下四种可能性之一:

    1,2
    2,1
    1,1
    2,2 for (int i = 0; i< intQuantity; ++i) { int min = 1; int max = 9; int number1 = rand(); int numGen = number1 % max + min; if (intQuantity > max) { intQuantity = max; } for (int k = 0; k < 1; k++) { cout << numGen << "\t"; int b = numGen; } int b = numGen; if (b != numGen ) { cout << numGen << "\t"; } else { i--; } } }
    number1 % max
    
    unsigned int UniqueRandomMapping(unsigned int x)
    {
        const unsigned int p = 11; //any prime number satisfying p ≡ 3 (mod 4)
        unsigned int r = ((unsigned long long) x * x) % p;
        if (x <= p / 2) return r;
        else return p - r;
    }