C++ 确保4个随机值完全不相等的更好方法?

C++ 确保4个随机值完全不相等的更好方法?,c++,C++,我有一个qt表单,它有一个乘法问题和4个按钮。4个按钮(选项)是随机生成的,问题也是如此 我只想把这4个选项随机化,这样它们是随机的,但没有一个与其他选项等效。我现在就是这样做的,但效果不太好: while (choice1 == choice2 || choice1 == choice3 || choice1 == choice4) choice1 = (rand() % max) + 1; while (choice2 == choice1 || choice2 == choice3

我有一个qt表单,它有一个乘法问题和4个按钮。4个按钮(选项)是随机生成的,问题也是如此

我只想把这4个选项随机化,这样它们是随机的,但没有一个与其他选项等效。我现在就是这样做的,但效果不太好:

while (choice1 == choice2 || choice1 == choice3 || choice1 == choice4)
    choice1 = (rand() % max) + 1;
while (choice2 == choice1 || choice2 == choice3 || choice2 == choice4)
    choice2 = (rand() % max) + 1;
while (choice3 == choice1 || choice3 == choice2 || choice3 == choice4)
    choice3 = (rand() % max) + 1;
while (choice4 == choice1 || choice4 == choice2 || choice4 == choice3)
    choice4 = (rand() % max) + 1;

还有其他人有更好的方法吗?

你想洗牌吗


你想洗牌吗

类似于(未经测试,只是写在这里,但你应该知道):

std::set s;
而(s.size()<4)
{
s、 插入(rand());
}
类似(未经测试,仅在此处编写,但您应该了解):

std::set s;
而(s.size()<4)
{
s、 插入(rand());
}

因为元素的数量是固定的,而且非常小,所以您的总体方法非常合理。然而,实现是有缺陷的

以下是如何修复它:

choice1 = (rand() % max) + 1;
do { choice2 = (rand() % max) + 1; } while (choice2 == choice1);
do { choice3 = (rand() % max) + 1; } while (choice3 == choice1 || choice3 == choice2);
do { choice4 = (rand() % max) + 1; } while (choice4 == choice1 || choice4 == choice2 || choice4 == choice3);

如果需要更多的元素,或者元素的数量是可变的,那么有更好的方法来实现这一点。

因为元素的数量是固定的,而且非常小,所以您的总体方法是非常合理的。然而,实现是有缺陷的

以下是如何修复它:

choice1 = (rand() % max) + 1;
do { choice2 = (rand() % max) + 1; } while (choice2 == choice1);
do { choice3 = (rand() % max) + 1; } while (choice3 == choice1 || choice3 == choice2);
do { choice4 = (rand() % max) + 1; } while (choice4 == choice1 || choice4 == choice2 || choice4 == choice3);
如果一个人需要更多的元素,或者元素的数量是可变的,那么有更好的方法来实现这一点。

如何做到这一点

while (choice1 == choice2 || choice1 == choice3 || choice1 == choice4 || choice2 == choice3 || choice2 == choice4 || choice3 == choice4){    
    choice1 = (rand() % max) + 1; 
    choice2 = (rand() % max) + 1;
    choice3 = (rand() % max) + 1;
    choice4 = (rand() % max) + 1;
}
这是怎么回事

while (choice1 == choice2 || choice1 == choice3 || choice1 == choice4 || choice2 == choice3 || choice2 == choice4 || choice3 == choice4){    
    choice1 = (rand() % max) + 1; 
    choice2 = (rand() % max) + 1;
    choice3 = (rand() % max) + 1;
    choice4 = (rand() % max) + 1;
}

将这四个元素放在一个向量中,并对其调用
std::random\u shuffle

将这四个元素放在一个向量中,并在其上调用
std::random\u shuffle

你将
choice1
初始化为
choice4
初始化为什么?我最初将它们都设置为上面的随机方程。我用时间(0)为rand函数设定种子。你将
choice1
初始化为
choice4
初始化为什么?我最初将它们全部设置为上面的随机方程。我在rand函数中植入了时间(0)@amit:是的,修复了它,人们只是习惯于在for循环中使用
i
)我回复了我的评论,我也有同样的问题,但一开始你是对的,我想,当你实际上有4个元素在集合中时停止:)无论如何,很好的方法,+1。我可能会更早地利用它,但现在其他人提供的工作很好。很好,可扩展,不需要编译时间限制+1.@amit:是的,修复了,人们只是习惯于在for循环中使用
i
)我回复了我的评论,我也有同样的问题,但一开始你是对的,我想,当你实际上有4个元素在集合中时停止:)无论如何,很好的方法,+1。我可能会更早地利用它,但现在其他人提供的工作很好。很好,可扩展,不需要编译时间限制+1.有效,但可能非常浪费(特别是当
max
较小时)。有效,但可能非常浪费(特别是当
max
较小时)。