问题存储如下:
arr[y][x] = { "Question1text" , "answer1" , "answer2" , "answer3" , .... , "boolean" }
获得随机问题
randomQuestion = qrand() % questionCount;
当我已经使用了那个问题时,我将nr 6设置为=“1”,所以我现在看 对于一个随机但没有“1”集
while( question[randomQuestion][6] == "1" )
{
randomQuestion = qrand() % questionCount;
}
但是让我们说在剩下的10k中只有一个问题。随机数准确击中该问题的可能性并不那么明显。 所以必须有一个更好的方法来实现这一点,但是如何?
答案 0 :(得分:2)
您可以在列表类(如QList)中存储您的问题(为单个问题定义类或结构),而不是使用旧式数组。 然后您可以在使用后删除问题......
尝试这样的事情:
randomQuestion = qrand() % questionList.count();
nextQuestion = questionList.takeAt(randomQuestion);
答案 1 :(得分:1)
您可以使用标准类std::bitset
来标记已选择的问题。以下是您可以用作基础的示例
#include <iostream>
#include <bitset>
#include <cstdlib>
#include <ctime>
int main()
{
const size_t N = 10;
char s[N][3] = { "Q0", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9" };
std::bitset<N> b;
std::srand( ( unsigned int )std::time( 0 ) );
size_t availableQuestions = N;
while ( availableQuestions )
{
size_t i = std::rand() % availableQuestions;
size_t question = 0;
while ( i != 0 || b[question] )
{
if ( !b[question++] && i != 0 ) --i;
}
b.set( question );
std::cout << s[question] << std::endl;
--availableQuestions;
}
return 0;
}
第一次运行的输出是
Q1
Q9
Q8
Q4
Q6
Q5
Q3
Q2
Q7
Q0
第二轮的输出是
Q7
Q5
Q0
Q1
Q2
Q4
Q9
Q8
Q6
Q3
使用for循环代替while循环
会更好for ( size_t availableQuestions = N; availableQuestions != 0; --availableQuestions )
{
size_t i = std::rand() % availableQuestions;
size_t question = 0;
while ( i != 0 || b[question] )
{
if ( !b[question++] && i != 0 ) --i;
}
b.set( question );
std::cout << s[question] << std::endl;
}
享受:!)
答案 2 :(得分:1)
Shuffle问题,然后简单地遍历洗牌组。当你到达集合的末尾时,重新洗牌并重新开始。改组n
问题需要O(n)
工作,所以只要你将它们存储在内存中,这是一个便宜而简单的解决方案。
答案 3 :(得分:0)
这样的事情怎么样?
question[randomQuestion] = question[--questionCount];
答案 4 :(得分:0)
不要使用数组,而是使用列表,以便从中删除选定的问题。然后只需随机选择一个列表成员。