<分区>
这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topic 在这里,这个问题的解决方式不太可能帮助 future 的读者。
有人可以帮我生成 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 中,对其进行打乱,然后从中重新创建列表。