C++ 生成随机数并避免重复值

C++ 生成随机数并避免重复值,c++,arrays,C++,Arrays,我现在正试图: 1.随机生成四个数字。 2.将它们存储在数组中。 3.确保数组中的值不重复 以下是我的想法: 1.在for循环中每次生成一个数字(x4次) 2.生成数字后,使用内部循环将其与上一个数组值进行比较 我的代码: do { for (int i = 0; i < 4; i++) { value[i] = rand() % 6 + 1; // Generating value for (int j = 0; i >

我现在正试图: 1.随机生成四个数字。 2.将它们存储在数组中。 3.确保数组中的值不重复

以下是我的想法: 1.在for循环中每次生成一个数字(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);
do
{ 
对于(int i=0;i<4;i++)
{
值[i]=rand()%6+1;//生成值
对于(int j=0;i>j;j++)
{
如果(值[i]==值[j])
{
dup=真;中断;
}
如果(dup==真)中断;
}
}
对于(int i=0;i<4;i++)
{

cout至于为什么会得到重复的结果,这是因为您在(dup!=true)
期间继续重试

这意味着它将继续尝试,直到有一个重复


在任何情况下,这类问题通常最好用a来解决,但是,对于这个小搜索空间(六分之四),您可以不使用您的方案

但是,最好按照以下步骤检查每个数字与之前的每个数字:

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变体非常简单:

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

您的代码中存在逻辑缺陷。当您从循环中中断时,您已经将兰德公司生成的重复值存储到了“值”数组中。您必须重新处理索引,直到没有重复的数据结构为止,或者使用更好的数据结构


为什么不使用一个
集合
,这样它只会保存唯一的值,当你填充了N个唯一的元素时,你可以退出/中断。

你似乎忘记问一个问题。很抱歉。我现在要添加看看这个答案,
dup
在哪里设置为
false
?一旦
为true
,它会不会停止永远是这样吗?还有,你为什么要打破两次?你好,谢谢你的快速回复。我现在正在学习Fisher Yates shuffle,这就是我要找的,非常感谢,谢谢!!!