我们电脑所生成的随机数,真的是随机数吗? | Katayo's Nekobox

LOADING

加载过慢请刷新(●´∀`●)

我们电脑所生成的随机数,真的是随机数吗?

? ? ?

⚠️导入

很多人习惯于用随机数网站或者随机数程序来生成随机数。但是我们不知道的是,随机数并不随机。

很多玩过minecraft的朋友都知道,在世界生成之前编辑即将生成的地图的时候,我们可以输入一个种子来指定所生成的生物群系,从而实现出生在人为指定的不同区域中。

如果把随机数比作生成的地图,那么对于随机数来讲,它也有专属于它的种子。

🔯代码演示

以下是一个能够自定义种子并根据种子生成100个随机数的C++程序代码,大家可以复制之后放在编译器上运行一下

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    int i = 0;
    int input;
    cout << "请输入随机数种子";
    cin >> input;
    srand(input);
    cout << "分别输入最大数和最小数";
    int max_number, min_number;
    cin >> max_number >> min_number;
    for (int j = 1; j <= 100; j++) {
        int random_number = (rand() % (max_number - min_number + 1)) + min_number;
        cout << random_number << '\t';
        if(j%5==0){ //每输出5个数换行
            cout << '\n';
        }
    }
    return 0;
}

其中使用的rand() 函数和srand()函数均为C的标准库函数,包含在stdlib.h内。(C++代码中可以使用<cstdlib>方法引入)
下面是示例输入和输出结果:

☯️示例一

输入

请输入随机数种子888
分别输入最大数和最小数100 10

输出

36      82      77      18      91
37      64      71      67      70
43      50      46      78      32
93      86      72      30      77
64      34      56      20      43
56      57      21      82      54
74      69      54      29      100
66      13      62      21      13
71      59      55      68      22
63      47      43      74      74
86      50      65      75      49
89      56      26      83      50
12      96      19      92      33
57      40      88      83      20
28      33      50      72      30
50      33      85      21      95
85      64      90      32      68
31      54      84      66      97
88      99      31      14      24
48      40      66      33      98

☯️示例二

输入

请输入随机数种子114514
分别输入最大数和最小数514 114

输出

426     379     412     163     375
187     132     310     494     150
473     236     199     323     472
221     495     166     334     356
424     185     303     399     166
173     143     497     213     204
284     305     319     227     464
449     293     503     360     310
204     398     293     428     362
188     399     237     231     164
209     120     255     280     177
330     258     405     219     207
162     423     476     312     137
506     384     497     413     322
484     471     114     174     214
359     494     471     386     138
295     385     148     293     152
377     199     154     467     334
383     356     300     486     355
319     139     319     462     302

✝️示例三

输入

请输入随机数种子888
分别输入最大数和最小数150 50

输出

59      100     114     115     119
125     65      74      145     61
79      112     61      72      83
125     127     96      65      111
59      92      116     112     124
102     109     91      65      129
98      108     134     129     105
113     119     107     88      117
96      122     116     78      85
100     74      72      142     150
145     67      122     89      119
114     100     103     136     102
97      137     54      54      58
70      148     98      81      67
135     139     70      69      73
116     104     83      60      93
137     101     106     70      86
81      149     65      70      133
80      114     107     124     100
85      143     52      56      142

大家可以使用自己的编译器来参照示例进行输入,再对比自己所生成的数据是不是和参照示例一致。也可以重复输入自己的数据,看看结果是否一致。

🔆我的一些看法

以下观点均为个人主观看法,存在很多不严谨的地方,若有什么问题可以在下方评论区留言

既然“随机数并不随机”这一假说已经成立,那么它就为暗箱操作提供了非常大的空间。

例如,我们可以先指定一个我们已知生成数据的种子来生成随机数,然后对生成的这一堆看似随机的数据各自对应的标本中加入人为干涉的痕迹(俗称动手脚
比如缅北电诈集团的“杀猪盘”设下的赌局,被骗的人总是以为自己所获得的那个数字是随机的,亏钱了总是责怪自己运气不好,殊不知这一串“随机”的数字背后是电诈公司有规律地设置下的陷阱。然后,据此再利用被骗者的赌徒心理,诈骗巨额财产,甚至使被骗者家破人亡。
这种做法同样适用于很多不怀好意的人。

但是我并不是说以后就不要使用那些能够生成随机数的程序或者网站了,我只是想让我们算力仍然有限的电子计算机产生的随机数能够“干净”一点,而不是让他成为坏人的工具。
默认情况下,程序生成随机数的种子是当前的系统时间,而由于系统时间每时每刻都在不断更新并且数据是不同的,我们使用随机数程序生成的数据的规律很难被找到,一般我们并不需要担心我们生成的随机数并不“干净”的问题。

让随机数做它本应该做的事,这就够了

—end—