生成随机数,并保证在给定域之间覆盖所有

Generate random number and guaranteed to cover all between the given domain?

本文关键字:之间 覆盖 随机数      更新时间:2023-10-16

有人可以帮助我生成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数据结构的实现进行洗牌。我希望通过创建一个新列表并将元素(RandomNumber(元素添加到新的洗牌列表中来实现这一目标。如前所述,上面的代码实际上应该足以实现这一目标。

如果您已经为链接列表类编写了迭代器,则可以调整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';
}

但是,这将非常低效,因此您可能更喜欢将列表复制到向量,洗牌并从中重新创建列表。

此代码生成1000个随机数。标准函数srand((通过"种子"为rand((生成随机序列,将其作为参数。time((函数需要当前时间,因此每次序列都是唯一的。

#include <random>
#include <ctime>
#include <vector>
using std::vector;
int main() {
    srand(time(0));
    vector<int> v;
    for (int i = 0, num = 0; i < 1000; ++i) {
        num = rand()%72;
        v.push_back(num);
    }
}