生成随机数并避免重复值

时间:2016-01-30 03:58:03

标签: c++ arrays

我现在正试图: 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);

我想知道为什么仍会生成相同的数组值,因为在我的代码中,循环将重复,直到找不到更多的重复值。

2 个答案:

答案 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个唯一元素时可以退出/中断。