高质量的c++随机数生成方法

       随机数用的场合非常多,比如卷积神经网络算法中,初始的卷积核权值就是随机数;图像处理上的柏林噪声,要用到随机数;微信抢红包嘛,谁抢的多、谁抢的少,拼人品、拼手气,其实拼的是程序背后的随机数。如果觉得c++自带的rand()生成的随机数不理想,想使用高质量的快速随机数产生器boost::mt19337,但又没有安装boost库,然后又不想用c++ 11,那怎么办?用下面这个吧,这个应该和boost::mt19337是一样的,但本人没有具体去验证。下面是代码示例,用法非常简单,设定随机种子后,就可以各种使用了。

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#include "mt19937ar.h"

int main()
{
	// 系统自带随机数生成
	printf("default...\n");
	srand((unsigned int)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		printf("%d: %d\n", i, rand());
	}

	// mt19937随机数生成
	printf("\nmt19937...\n");
	init_genrand((unsigned long)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		printf("%d: %f  %d\n", i, genrand_real1(), genrand_int31());
	}

	system("pause");
	return 0;
}

       程序运行结果如下:

                                                              


       工程下载链接:http://download.csdn.net/detail/u013085897/9738108




要在 C++ 中生成高效高质量的随机数,可以使用以下步骤: 1. 使用 C++11 引入的随机数库:C++11 引入了一个更好的随机数库,其中包括了更高质量随机数生成器和分布函数。这些库位于 `<random>` 头文件中。 2. 使用适当的随机数生成器:`std::mt19937_64` 是一个优秀的伪随机数生成器,使用 Mersenne Twister 算法,可以生成高质量的伪随机数。它的周期非常长,可以满足大多数应用场景。 3. 初始化随机数生成器:使用不同的种子来初始化随机数生成器,可以产生不同的随机序列。可以使用 `std::random_device` 来获得真正的随机种子,或者使用时间戳、进程 ID 等值作为种子。 4. 使用适当的分布函数:根据需求选择合适的分布函数来生成随机数。常见的分布函数包括均匀分布 (`std::uniform_int_distribution`、`std::uniform_real_distribution`)、正态分布 (`std::normal_distribution`)、泊松分布 (`std::poisson_distribution`) 等。 5. 避免频繁初始化随机数生成器:初始化随机数生成器是一个相对较耗时的操作,尽量避免在循环中频繁初始化生成器。如果需要多次生成随机数,可以将生成器对象放在循环外,并重复使用。 下面是一个示例代码: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; std::mt19937_64 rng(rd()); std::uniform_int_distribution<int> dist(1, 10); for (int i = 0; i < 10; ++i) { int random_number = dist(rng); std::cout << "随机数为:" << random_number << std::endl; } return 0; } ``` 在上述示例中,我们使用 `std::random_device` 获得一个真正的随机种子,并将其传递给 `std::mt19937_64` 初始化随机数生成器。然后,使用 `std::uniform_int_distribution` 定义了一个范围为1-10的均匀分布,并使用 `rng` 生成随机数。我们循环生成了10个随机数,并打印结果。 记住,要生成高效高质量的随机数,最好使用 C++11 引入的随机数库,并遵循上述步骤来选择适当的随机数生成器和分布函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值