非重复随机数发生器

时间:2011-03-21 18:36:00

标签: c++ random generator

我想制作一个不重复它给出的数字的数字生成器 已经(C ++)。

我所知道的是:

int randomgenerator(){
  int random;
  srand(time(0));
  random = rand()%11;
  return(random);
} // Added this on edition

该功能为我提供了多余的数字。

我正在尝试创建一个问卷程序,以随机顺序发出10个问题,我不希望再出现任何问题。

有谁知道语法?

7 个答案:

答案 0 :(得分:18)

我会做什么:

  • 生成长度为N的向量,并将其填入值1,2,... N。
  • 使用std::random_shuffle
  • 如果您说30个元素并且只想要10个元素,请使用向量中的前10个元素。
编辑:我不知道问题是如何存储的,所以......:)

我假设问题存储在矢量或某些随机访问中。现在我生成了10个不重复的随机数:7,4,12,17,1,13,9,2,3,10。

我会将它们用作问题向量的索引:

std::vector<std::string> questions;
//fill with questions
for(int i = 0; i < number_of_questions; i++)
{
    send_question_and_get_answer(questions[i]);
}

答案 1 :(得分:7)

你正试图以“错误的方式”解决问题。

请尝试使用此功能(假设您有一个带有问题ID的vector<int>,但同样的想法适用于您拥有的任何内容):

  1. 从0到N-1获取随机R,其中N是容器中的问题数
  2. 将问题R添加到另一个“选定”问题集合
  3. 如果“选定问题”集合中有足够的项目,则表示您已完成
  4. 从原始容器中移除问题R(现在N已减少1)
  5. 转到1

答案 2 :(得分:6)

听起来你基本上想要shuffle a deck of cards(在这种情况下,“卡片”是问题或问题数字)。

在C ++中,我会这样做:

#include <vector>
#include <algorithms>

std::vector<int> question_numbers;
for (unsigned int i = 0; i < 10; ++i)
    question_numbers.push_back(i+1);
std::random_shuffle(question_numbers.begin(), question_numbers.end());

// now dole out the questions based on the shuffled numbers

您不必分发所有问题,只需要在每次玩游戏时都要处理一整套卡片。当然,你可以,但没有这样的要求。

答案 3 :(得分:4)

创建一个包含10个元素(数字1-10)的向量,然后使用std::random_shuffle对其进行随机播放。然后迭代它。

答案 4 :(得分:1)

应该看起来更像这样:(注意:不解决你原来的问题)。

int randomgenerator(){
  int random;

  // I know this looks re-dunand compared to %11
  // But the bottom bits of rand() are less random than the top
  // bits do you get a better distribution like this.

  random = rand() / (RAND_MAX / 11);

  return random;
}

int main()
{
    // srand() goes here.
    srand(time(0));

    while(true)
    {
        std::cout << randomgenerator() << "\n";
    }
}

解决原始问题的更好方法是预先生成数字,这样您就知道每个数字只会出现一次。然后随机洗牌。

int main()
{
    int data[] =  { 0,1,2,3,4,5,6,7,8,9,10,11};
    int size   =  sizeof(data)/sizeof(data[0]);

    std::random_shuffle(data, data + size);

    for(int loop = 0; loop < size; ++loop)
    {
        std::cout << data[loop] << "\n";
    }
}

答案 5 :(得分:0)

//non repeating random number generator
for (int derepeater = 0; derepeater < arraySize; derepeater++)
{
    for (int j = 0; j < arraySize; j++)
    {
        for (int i = arraySize; i > 0; i--)
        {
            if (Compare[j] == Compare[i] && j != i)
            {
                Compare[j] = rand() % upperlimit + 1;
            }
        }
    }
}

答案 6 :(得分:0)

为什么不使用某些STL为您执行检查?想法:

创建一个(初始为空)由10个整数组成的集合,这些集合将作为随机问题的索引(它们将是不同的,因为集合禁止重复项)。继续在其中推[0,num_of_questions-1]中的随机数,直到随机数增长到10(重复数将自动被拒绝)。准备好该集合后,对其进行迭代并输出相应索引的问题:

std::vector<std::string> questions = /* I am assuming questions are stored in here */
std::set<int> random_indexes;

/* loop here until you get 10 distinct integers */
while (random_indexes.size() < 10) random_indexes.insert(rand() % questions.size());

for (auto index: random_indexes){
    std::cout << questions[index] <<std::endl;
}

我可能会丢失一些东西,但是在我看来,使用对问题或索引进行混洗的答案会执行更多的计算,或者会使用不必要的内存开销。