C++

C++ 知识量:19 - 82 - 316

17.4 随机数><

随机数引擎类- 17.4.1 -

在C++中,可以使用标准库中的<random>头文件来生成随机数。这个库提供了多种随机数生成器和分布。

下面是一个简单的例子,展示了如何使用这个库来创建一个随机数引擎类:

#include <random>  
#include <iostream>  
  
class RandomEngine {  
public:  
    RandomEngine() : gen(rd()) {  
        // 初始化随机数引擎。这里我们使用了时间作为种子。  
    }  
  
    int getRandom() {  
        // 返回一个介于0和RAND_MAX之间的随机数  
        return gen();  
    }  
  
private:  
    std::mt19937 gen; // 使用Mersenne Twister算法生成随机数  
    std::random_device rd; // 用来获取随机数种子  
};  
  
int main() {  
    RandomEngine re; // 创建一个随机数引擎对象  
  
    // 输出10个随机数  
    for (int i = 0; i < 10; ++i) {  
        std::cout << re.getRandom() << std::endl;  
    }  
  
    return 0;  
}

这个例子中,创建了一个名为RandomEngine的类,它有一个getRandom方法来生成随机数。在构造函数中,初始化了随机数引擎,使用std::random_device来获取一个随机的种子,然后使用这个种子来初始化std::mt19937引擎。然后,getRandom方法简单地调用了引擎的operator()方法来生成随机数。

随机数分布- 17.4.2 -

在C++中,可以使用标准库中的<random>来生成并管理随机数分布。这个库提供了多种随机数分布,包括均匀分布、正态分布、伯努利分布等。

以下是一个使用均匀分布的简单例子:

#include <random>  
#include <iostream>  
  
int main() {  
    std::random_device rd; // 用来获取随机数种子  
    std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数  
    std::uniform_int_distribution<> dis(0, 100); // 定义分布,范围是[0,100]  
  
    for (int n=0; n<10; ++n) {  
        std::cout << dis(gen) << ' ';  
    }  
    std::cout << '\n';  
}

在这个例子中,生成了10个介于0和100之间的随机整数。std::uniform_int_distribution<>定义了随机数的分布,dis(gen)则生成一个随机数。这种方式产生的随机数比C语言中的 rand() 函数产生的随机数更均匀、更随机。

如果想要其他类型的分布,如正态分布,可以用std::normal_distribution<>替换std::uniform_int_distribution<>。例如:

#include <random>  
#include <iostream>  
  
int main() {  
    std::random_device rd; // 用来获取随机数种子  
    std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数  
    std::normal_distribution<> dis(0.0, 1.0); // 定义分布,平均值为0.0,标准差为1.0  
  
    for (int n=0; n<10; ++n) {  
        std::cout << dis(gen) << ' ';  
    }  
    std::cout << '\n';  
}

在这个例子中,生成了10个平均值为0.0,标准差为1.0的正态分布的随机浮点数。

生成随机实数- 17.4.3 -

在C++中,可以使用标准库中的 <random> 来生成随机实数。下面是一个示例代码:

#include <iostream>  
#include <random>  
  
int main() {  
    std::random_device rd; // 用来获取随机数种子  
    std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数  
    std::uniform_real_distribution<> dis(0.0, 1.0); // 定义分布,范围是[0.0,1.0]  
  
    for (int n=0; n<10; ++n) {  
        std::cout << dis(gen) << ' ';  
    }  
    std::cout << '\n';  
}

这个代码将生成10个介于0.0和1.0之间的随机实数。std::uniform_real_distribution<> 定义了随机数的分布,dis(gen) 则生成一个随机数。这种方式产生的随机数比C语言中的 rand() 函数产生的随机数更均匀、更随机。

生成非均匀分布的随机数- 17.4.4 -

要生成非均匀分布的随机数,需要使用不同的分布函数。在C++的<random>库中,提供了多种非均匀分布,如正态分布、泊松分布、指数分布等。

要在C++中生成指数分布的随机数,可以使用std::exponential_distribution。以下是一个简单的示例:

#include <iostream>  
#include <random>  
  
int main() {  
    std::random_device rd; // 用来获取随机数种子  
    std::mt19937 gen(rd()); // 使用Mersenne Twister算法生成随机数  
    std::exponential_distribution<> dis(1.0); // 定义分布,参数为1.0  
  
    for (int n=0; n<10; ++n) {  
        std::cout << dis(gen) << ' ';  
    }  
    std::cout << '\n';  
}

这个代码将生成10个指数分布的随机数,参数为1.0。指数分布是一种连续概率分布,其特征是所有值都具有相同的概率,即它们是“记忆丢失”的。可以根据需要调整参数来改变分布的形状和范围。