我现在正试图: 1.随机生成四个数字。 2.将它们存储在阵列中。 3.确保数组中的值不重复。
这是我的想法: 1.每次循环生成一个数字(x4次) 2.生成数字后,使用内部循环将其与之前的数组值进行比较。
我的代码:
do
{
for (int i = 0; i < 4; i++)
{
value[i] = rand() % 6 + 1; // Generating value
for (int j = 0; i > j; j++)
{
if (value[i] == value[j])
{
dup = true; break;
}
if (dup == true) break;
}
}
for (int i = 0; i < 4; i++)
{
cout << "value: " << value[i] << " " << endl;
}
} while (dup != true);
我想知道为什么仍会生成相同的数组值,因为在我的代码中,循环将重复,直到找不到更多的重复值。
答案 0 :(得分:0)
就您获得重复结果的原因而言,这是因为您继续重试while (dup != true)
。仔细阅读:虽然不重复,但请继续尝试。
这意味着它将继续尝试,直到 重复。
在任何情况下,这类问题通常最好用Fisher Yates shuffle来解决,但是,对于这个小搜索空间(六个中的四个),你可以躲开你的计划。
但是,按照以下方式检查每个号码与以前的每个号码相比,可能会做得更好:
def getFourFromSix():
num = []
num.append (random(1..6))
num.append (num[0])
while num[1] == num[0]:
num[1] = random(1..6)
num.append (num[0])
while num[2] == num[0] or num[2] == num[1]:
num[2] = random(1..6)
num.append (num[0])
while num[3] == num[0] or num[3] == num[1] or num[3] == num[2]:
num[3] = random(1..6)
return num
这样,你实际上并没有完全回头并且每次找到重复时重新启动,你只需要再次尝试当前的数字。
如果你做想要一个Fisher Yates shuffle(并且如果数字池变得更大,它会更优雅),M-from-N变体就像这样简单: / p>
def getMFromN(m, n):
# Sanity checking.
if m > n:
throw "Trying to extract too many things"
num = []
# Populate choices that we will select from.
for index in 0..n-1:
choice[index] = index + 1
# For each desired number.
for index in 0..m:
# Copy from choices to results.
choose = random(0..n-1)
num.append (choice[choose])
# Remove from results so no repeats.
n = n - 1
choice[choose] = choice[n]
return num
答案 1 :(得分:0)
您的代码存在逻辑缺陷。当你从循环中断开时,你已经将rand生成的重复值存储到'value'数组中。您将不得不重新处理索引,直到您没有重复 - 或 - 使用更好的数据结构。
为什么不以set<int>
方式使用它只保存唯一值,并且在填充N个唯一元素时可以退出/中断。