带有随机数的二维数组不变

时间:2018-10-19 22:16:53

标签: c++ arrays random

我正在创建一个2维数组,其随机数为[0,9] 它可以工作,但是第二次执行完矩阵后 更改。为什么?

每次执行代码时,我都需要一个新的随机矩阵,而不是旧的运行时矩阵。问题出在哪里,我该如何解决?

#include <QCoreApplication>
#include <iostream>
#include <random>

constexpr int dim_rows = 3;
constexpr int dim_cols = 5;

template <size_t dim_rows, size_t dim_cols>
void print_2d_array(int (&outputArray)[dim_rows][dim_cols]){
    std::cout << __func__ << std::endl;
    for (size_t i = 0; i < dim_rows; i++){
        std::cout << i << ": ";
        for(size_t j = 0; j < dim_cols; j++) {
            std::cout << outputArray[i][j] << " ";
        }std::cout << std::endl;
    }
}

int main(int argc, char *argv[])
{
    std::default_random_engine generator;
    std::uniform_int_distribution <int> distribution(0,9);

    int twoDimA[dim_rows][dim_cols] = {{}};

    for(int i = 1; i < dim_rows; i++) {
        for(int j = 1; j < dim_cols; j++) {
            twoDimA[i][j] = distribution(generator);
        }
    }

    print_2d_array(twoDimA);
}

3 个答案:

答案 0 :(得分:3)

您必须播种引擎。尝试

generator.seed(n);

http://www.cplusplus.com/reference/random/default_random_engine/

答案 1 :(得分:0)

您将要使用seed()函数将随机数生成器随机化。通常,对于这样的事情,只需一个时间戳就足够了。您只想确保每次运行的种子值都不同。

或熔岩灯。您可以用一堆熔岩灯播种。 Google“随机数熔岩灯”。 ;)

答案 2 :(得分:0)

正如其他人所说,您每次需要为引擎generator.seed(n)注入不同的编号。默认情况下,它每次都使用相同的种子,这就是为什么您获得相同结果的原因。

数字生成器不是真正的“随机”,而是“ pseudorandom”。这意味着给定相同的种子,后续调用生成的数字序列将完全相同。但是,如果您每次都提供不同的种子(即使种子靠得很近),则对于大多数目的 all 来说,它是足够随机的。

人们通常选择当前的时钟时间作为种子,或者选择std :: random_device作为建议的对象,或者选择一些变化的值。在“真实”随机性很重要的领域(例如计算机安全性)中,有时他们甚至会做一些事情,例如为熔岩灯拍照;)