非重复随机数发生器

Jpe*_*nay 5 c++ random generator

我想创建一个不重复它已经发出的数字的数字生成器(C++).

我所知道的是:

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

那个功能给了我多余的数字.

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

有谁知道语法?

The*_*uck 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]);
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 7

你试图以"错误的方式"解决问题.

试试这个(假设你有一个vector<int>问题ID,但同样的想法将适用于你拥有的任何东西):

  1. 从0到N-1获得随机R,其中N是容器中的问题数
  2. 将问题R添加到另一个"选定"问题集合中
  3. 如果"选定问题"集合中有足够的项目,那么您就完成了
  4. 从原始容器中删除问题R(现在N减少了1)
  5. 转到1


Max*_*ert 6

听起来你基本上想要洗牌一副牌(在这种情况下,"卡片"是问题,或问题数字).

在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
Run Code Online (Sandbox Code Playgroud)

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