? ? ?
⚠️导入
很多人习惯于用随机数网站或者随机数程序来生成随机数。但是我们不知道的是,随机数并不随机。
很多玩过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
大家可以使用自己的编译器来参照示例进行输入,再对比自己所生成的数据是不是和参照示例一致。也可以重复输入自己的数据,看看结果是否一致。
🔆我的一些看法
以下观点均为个人主观看法,存在很多不严谨的地方,若有什么问题可以在下方评论区留言
既然“随机数并不随机”这一假说已经成立,那么它就为暗箱操作提供了非常大的空间。
例如,我们可以先指定一个我们已知生成数据的种子来生成随机数,然后对生成的这一堆看似随机的数据各自对应的标本中加入人为干涉的痕迹(俗称动手脚)
比如缅北电诈集团的“杀猪盘”设下的赌局,被骗的人总是以为自己所获得的那个数字是随机的,亏钱了总是责怪自己运气不好,殊不知这一串“随机”的数字背后是电诈公司有规律地设置下的陷阱。然后,据此再利用被骗者的赌徒心理,诈骗巨额财产,甚至使被骗者家破人亡。
这种做法同样适用于很多不怀好意的人。
但是我并不是说以后就不要使用那些能够生成随机数的程序或者网站了,我只是想让我们算力仍然有限的电子计算机产生的随机数能够“干净”一点,而不是让他成为坏人的工具。
默认情况下,程序生成随机数的种子是当前的系统时间,而由于系统时间每时每刻都在不断更新并且数据是不同的,我们使用随机数程序生成的数据的规律很难被找到,一般我们并不需要担心我们生成的随机数并不“干净”的问题。
让随机数做它本应该做的事,这就够了