更好的方法是确保4个随机值根本不相等?

时间:2012-01-25 11:42:53

标签: c++

我有一个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;

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

5 个答案:

答案 0 :(得分:10)

类似的东西(未经测试,只是写在这里,但你应该明白这一点):

std::set<int> s;

while(s.size() < 4 )
{
    s.insert(rand());
}

答案 1 :(得分:2)

由于元素数量固定且非常小,因此您的整体方法非常合理。但是,实施是错误的。

以下是如何解决的问题:

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);

如果需要更多元素,或者元素数量可变,有更好的方法可以做到这一点。

答案 2 :(得分:1)

答案 3 :(得分:1)

将四个元素放在一个向量中,然后在其上调用std::random_shuffle

答案 4 :(得分:0)

这是怎么回事。

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;
}