首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非重复随机数发生器

非重复随机数发生器
EN

Stack Overflow用户
提问于 2011-03-21 18:35:59
回答 7查看 35.7K关注 0票数 5

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

我只知道:

代码语言:javascript
运行
复制
int randomgenerator(){
  int random;
  srand(time(0));
  random = rand()%11;
  return(random);
} // Added this on edition

这个函数给了我多余的数字。

我试图创建一个问卷程序,以随机的顺序给出10个问题,我不希望任何问题再次出现。

有人知道语法吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-21 18:41:24

我要做的是:

  • 生成一个长度为N的向量,并用1,2,...N值填充它。
  • 使用随机播放
  • 如果你有30个元素,而只想要10个元素,请使用前10个向量。

编辑:我不知道这些问题是如何存储的,所以..。:)

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

我会用这些指标来表示问题的向量:

代码语言:javascript
运行
复制
std::vector<std::string> questions;
//fill with questions
for(int i = 0; i < number_of_questions; i++)
{
    send_question_and_get_answer(questions[i]);
}
票数 20
EN

Stack Overflow用户

发布于 2011-03-21 18:38:52

你试图用“错误的方法”解决这个问题。

尝试这样做(假设您有一个带有问题ids的vector<int>,但是相同的想法将适用于您拥有的任何东西):

  1. 得到一个从0到N1的随机R,其中N是容器中的问题数。
  2. 将问题R添加到“选定”问题的另一个集合中
  3. 如果“所选问题”集合有足够的项,您就完成了。
  4. 从原来的容器中删除问题R(现在N减少了1)
  5. 转到1
票数 7
EN

Stack Overflow用户

发布于 2011-03-21 18:39:28

听起来你本质上想要洗牌 (在本例中,“卡片”是问题或问题号)。

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

代码语言:javascript
运行
复制
#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

你不需要发所有的问题,就像你每次玩游戏时都要发一整副牌一样。你当然可以,但没有这样的要求。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5382037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档