c++ - 生成随机数并保证覆盖给定域之间的所有内容?

标签 c++ random

<分区>

有人可以帮我生成 0-71 之间的随机数,同时保证它会覆盖 0 到 71 之间的所有数字吗?

我试过以下方法,但有些数字出现不止一次,有些根本没有出现。

int max= 71;
int min= 0;

std::random_device engine;

//initialise to -1 to make sure numbers are generated and stored properly
int randomNum = -1;

while(max> 0){
  std::uniform_int_distribution<int> randomDistributed(min,max);
  randomNum = randomDistrubuted(engine);
  std::cout << randomNum << ", ";
  max--;
}

更新:这个问题是在我打算生成随机数时提出的,这样我就可以打乱我自己的 LinkedList 数据结构的实现。我希望通过创建一个新列表并将 oldList->get(randomNumber) 元素中的元素添加到新的随机列表来实现这一点。上面的代码实际上应该足以实现这一点,正如前面提到的当前句子之前的最后一句话。

最佳答案

如果您已经为您的链表类编写了一个迭代器,您可以采用 possible implementations 中的一个。 std::shuffle 对前向迭代器进行操作。

#include <iostream>
#include <list>
#include <random>
#include <algorithm>
#include <iterator>

template<class ForwardIt, class URBG>
void list_shuffle(ForwardIt first, ForwardIt last, URBG&& g)
{
    using diff_t = typename std::iterator_traits<ForwardIt>::difference_type ;
    using distr_t = std::uniform_int_distribution<diff_t>;
    using param_t = typename distr_t::param_type;
    using std::iter_swap;

    distr_t distr;
    diff_t n = std::distance(first, last);
    for (diff_t i = n - 1; i > 0; --i)
    {
        auto it = std::next(first, distr(g, param_t(0, i)));
        iter_swap(first++, it);
    }
}

int main() 
{
    std::random_device rd;
    std::mt19937 g(rd());
    std::list<int> a {1, 2, 3, 4, 5, 6, 7};


    list_shuffle(a.begin(), a.end(), g);

    for (auto const & i : a)
        std::cout << ' ' << i;
    std::cout << '\n';
}

不过,这会非常低效,因此您可能更愿意将列表复制到 vector 中,对其进行打乱,然后从中重新创建列表。

关于c++ - 生成随机数并保证覆盖给定域之间的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56125150/

相关文章:

c++ - 获取序列C++中的随机数

javascript - 从另一个数字生成一个随机数

ubuntu - GHC 8.4.2 无法导入 System.Random

c++ - Bubblesort 由于某种原因无法正常工作

C++构建错误

c++ - 私有(private)构造函数

python - 带有移位孔的环形空间内的随机点

javascript - 随机背景已准备就绪

c++ - 迭代时删除集合元素///

c++ - 如何使用异步获取的数据填充 QTableView?