我想制作一个不重复它给出的数字的数字生成器 已经(C ++)。
我所知道的是:
int randomgenerator(){
int random;
srand(time(0));
random = rand()%11;
return(random);
} // Added this on edition
该功能为我提供了多余的数字。
我正在尝试创建一个问卷程序,以随机顺序发出10个问题,我不希望再出现任何问题。
有谁知道语法?
答案 0 :(得分:18)
我会做什么:
我假设问题存储在矢量或某些随机访问中。现在我生成了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>
,但同样的想法适用于您拥有的任何内容):
答案 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;
}
我可能会丢失一些东西,但是在我看来,使用对问题或索引进行混洗的答案会执行更多的计算,或者会使用不必要的内存开销。