C++ 如何使随机数唯一
我正在做一个随机数发生器。它询问用户希望数字中包含多少位数。例如,如果输入2,将生成10到99之间的随机数。我已经制作了生成器,但我的问题是数字不是唯一的 这是我的密码。我不知道为什么它不生成唯一的数字。我认为srand(time(null))可以做到这一点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+
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;
}