浅谈随机数

伪随机数

通常编程语言中提供的随机数都是伪随机数,因为都是给定一个种子,然后多项式运算然后这样的,这种提供的随机数是有规律可预测的。

一个最简单的 C 语言随机数 snippet。但是每次执行的结果都是一样的,因为传入的种子是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>

int main ()
{
int random = rand();
printf("%d\n",random);
random = rand();
printf("%d\n",random);
random = rand();
printf("%d\n",random);
}

随机数

真正的随机数应该是完全不可预测的,通常可以用 linux 下的 /dev/random/dev/urandom 做真随机数生成器。

这是基于 linux 系统管理 devices 所产生的噪声的,比如磁盘寻道事件,键鼠事件等,因为这些事件噪声很高,熵足够高,所以可以认为是真随机。

  • /dev/random 用 cat 看一下可以发现知道生成随机数,不够的话就会阻塞。
  • /dev/urandom 是用之前 /dev/random 生成过的直接返回。

当然还有一个 random.org 的网站,网站提供真随机数,说是通过 atmospheric noise 来提供随机数的。

References

今天

换了新电脑 ThinkPadX1C 好开心阿。好轻阿。