我有一个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;
还有其他人有更好的方法吗?
答案 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;
}