得到随机值但不是同一个值的两倍

时间:2014-05-13 11:20:38

标签: c++ qt random

问题存储如下:

 arr[y][x] = { "Question1text" , "answer1" , "answer2" , "answer3" , .... , "boolean" }

获得随机问题

randomQuestion = qrand() % questionCount;

当我已经使用了那个问题时,我将nr 6设置为=“1”,所以我现在看 对于一个随机但没有“1”集

while( question[randomQuestion][6] == "1" )
{
    randomQuestion = qrand() % questionCount;
}

但是让我们说在剩下的10k中只有一个问题。随机数准确击中该问题的可能性并不那么明显。 所以必须有一个更好的方法来实现这一点,但是如何?

5 个答案:

答案 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)

不要使用数组,而是使用列表,以便从中删除选定的问题。然后只需随机选择一个列表成员。