生成一个rand()%25,其中每个数字只能出现一次

Csc*_*319 0 c++ arrays

我正在尝试使用数组来修正一个程序,它可以获得0到24之间的随机数,但它们只能出现一次.我知道如何生成随机数,我只是坚持如何检查数字中是否已存在数字.我尝试生成一个新的rand()%25并将其与数组中的占位符进行比较,如果它不存在则将新的随机数放在那里,但它不起作用.

 void MultiU (){
         int size = 5;
         int array[5];
        srand(time(0));

        for (int index = 0; index < size; index++){
           exists[index] = rand() %25;
          }
    }
Run Code Online (Sandbox Code Playgroud)

我是使用数组和rand()进行编程的新手.我希望有人可以指导我朝着正确的方向前进.

The*_*ant 9

std::unordered_set是你的朋友.它不允许/插入重复项,您可以利用这一事实获得5个不同的数字.当集合大小为5时,保证包含5个不同的元素.

std::unordered_set<int> s;

while (s.size() < 5) {
    s.insert(rand() % 25);
}
Run Code Online (Sandbox Code Playgroud)

  • @TheParamagneticCroissant什么错了?它大大降低了随机数的质量.如果生成"1,2,3,4,5"或"5,4,3,2,1"或"2,1,5,4,3"并不重要,您将从`unordered_set获得相同的输出`.这是不好的.很明显,如果你使用常规`set`,因为数字将按升序排列.但是`unordered_set`并不是很好,因为订单很容易预测. (3认同)
  • 保持生成顺序的@TheParamagneticCroissant解决方案在任何一种情况下都能正常工作.你的解决方案有限制,你甚至没有提到. (3认同)

aar*_*rkk 5

这是获取没有重复的随机数列表的一般方法:

#include <algorithm>
#include <iostream>
#include <random>
#include <vector>

int main() {
    std::vector<int> vals;
    for (size_t i = 0; i < 25; ++i) {
        vals.push_back(i);
    }
    std::shuffle(vals.begin(), vals.end(), std::mt19937());
    for (auto v : vals) {
        std::cout << v << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个有效的演示.

在这种情况下,这样做是低效的,然后只提取前五个数字.但是,随着可能的随机数列表变大(并且您想要选择更多的随机数),这种方法将比The Paramagnetic Croissant更有效.

我还应该补充一点,你不应该使用rand().或者尝试使用rand()模数来获得固定范围的随机数.它们将无法正确分发!

  • `default_random_engine`可能默认为坏引擎.最好明确使用`mt19937`,无论如何都要少输入. (2认同)
  • @remyabel`std :: random_shuffle`将rng函数作为其中一个参数,从C++ 14开始不推荐使用. (2认同)