随机数(1)

linux 内核内建了随机数生成器。从系统收集环境噪声放入熵池,产生随机数。通过/dev/random和/dev/urandom向应用提供随机数。

/dev/random 生成的随机数质量较高,产生随机数的速度较慢,应用从中读取随机数速率过快默认会阻塞

/dev/urandom 生成随机数的速度很快,质量较差,但并不会发生阻塞。

可以使用cat 或 hexdump 直接读出随机数

hexdump -C /dev/random

hexdump -C /dev/urandom

可以发现从 /dev/urandom 比/dev/random 要明显快很多。

 

/proc/sys/kernel/random 提供了关于/dev/random额外信息

entropy_avail:可用熵大小

poolsize:熵池大小

 

read_wakeup_threshold:可读阈值

write_wakeup_threshold:可写阈值

 

uuidboot_id:随机性字符串;前者每读一次变化一次,后者启动后一直不变

ioctl 提供接口访问或改变这些值。包括读取熵池大小,获取熵池中熵大小,改变熵大小,往熵池写数据增加熵,清空熵池。

rng-tools快速增加熵池中熵大小

安装rng-tools

yum install rng-tools

启动rngd

service rngd start

查看熵池中熵大小,发现由20-30变成了3000多,/dev/random 速率也快了很多

cat /proc/sys/kernel/random/entropy_avail

 

 

 

 

 

 

 

在C++中生成1到50之间的随机数,你可以使用 `<cstdlib>` 或 `<random>` 头文件中的函数。下面我将分别给出使用这两个库的方法: **方法1:使用 `<cstdlib>` 库** `<cstdlib>` 库中的 `rand()` 函数可以生成一个随机数,但是它返回的是一个从0开始的数。为了得到1到50的随机数,你需要进行一些调整。首先,使用 `srand(time(NULL))` 来设置随机数生成的种子,以确保每次运行程序时生成的随机数序列都不同。然后,使用 `rand() % 50 + 1` 来得到1到50的随机数。 示例代码如下: ```cpp #include <iostream> #include <cstdlib> #include <ctime> int main() { srand(time(0)); // 设置随机数种子 int random_number = rand() % 50 + 1; // 生成1到50之间的随机数 std::cout << "随机数: " << random_number << std::endl; return 0; } ``` **方法2:使用 `<random>` 库** `<random>` 库提供了更加现代和功能丰富的随机数生成方法。你可以创建一个 `mt19937` 随机数引擎,并使用它生成一个均匀分布的随机数。 示例代码如下: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; // 非确定性随机数生成器,通常用于初始化随机数引擎 std::mt19937 gen(rd()); // 使用随机数设备初始化Mersenne Twister引擎 std::uniform_int_distribution<> distrib(1, 50); // 定义1到50的均匀分布 int random_number = distrib(gen); // 生成随机数 std::cout << "随机数: " << random_number << std::endl; return 0; } ``` 使用 `<random>` 库的方法更为推荐,因为它提供了更好的随机性以及更好的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值