|
|
51CTO旗下网站
|
|
移步端
创造专栏

讨厌的人类居然让咱掷骰子,这实在太难了!

周日的深夜,Linux老大发布了燃眉之急会议通知,召集CPU、内存、硬盘等方方面面硬件,以及git、 vim、传感器、c、 Java等方方面面软件参会。

笔者:刘欣| 2020-01-15 09:35

周日的深夜,Linux老大发布了燃眉之急会议通知,召集CPU、内存、硬盘等方方面面硬件,以及git、 vim、传感器、c、 Java等方方面面软件参会。

老大对深夜打扰大家深表歉意,表示新春快来了,到时刻一定让大家好好休息,下一场就进来中心话题:人类要求我们学会“掷骰子”,该怎么办?

内存表示不解:为啥?想让咱赌钱玩吗?咱们这儿可没有骰子!

Linux老大:其实不是真实的掷骰子,是生成随机数,数在我们计算机里用途极为广泛,浮动密钥,拓展通信,浮动盐(salt)...... 不可能指望人去手工操作。

vim笑道:浮动随机数? 这太简单了,让新手退出我vim就行了。

Linux老大:为啥?

vim: 哈哈,因为新手不知晓怎么才能退出vim,就会瞎胡乱按一通, 异常随机,这不就形成数了吗?!

CPU阿甘:这笑话够冷的!

Linux老大:口头警告vim一次,盛大点儿, 浮动随机数是异样关键的作业,人类要求:

1. 要杂乱无章

2. 决不能预测,决不能根据已经生成的天文数字,推测出从一个指数是哪

3. 决不能重现, 无法重现和某一指数列完全相同的数列

欣闻此处,大家都吸了一人冷气,这要求够高的!人类通过掷骰子可以达到这个要求,但是计算机里都是确认的作法和程序,这该怎么办?

C老汉说:我说话一个方案,我听说人类有个书法,叫做什么线性同余算法,似乎可以变动随机数。

C老汉写副了一番公式:

内存想起和CPU阿甘折腾过的递归函数调用,说到:“观看递归我就头昏。”

C父亲说:其一算法很简单,A, C, M 都是细心选择的整数,租用者在变化无常随机数之前,先选一个种子(seed),比如说用当前的年华戳当作种子,咱们用简单的数字做个实验, 让A = 11 , C =5, M = 13, seed = 15

“探望,只是挺随机的!” C老汉挺得意。

Java 说:“其一算法很简单嘛,功能也无可非议,我也实现一下,放到我之java.util.Random当中吧。”

C父亲说:“我就放到我之srand函数和rand函数里。srand用于设定‘种子’,rand用于获取下一个指数。”

      
  1. srand((unsigned) time(&t));   
  2. // 进出口5个随机数 
  3. for(int i=1 ;i<=5; i++){ 
  4.     printf("%d\n", rand()); 

Java说:“探望,还是面向对象好吧,我之Random类封装了中间状态,他家只要求在创造Random目标的时节把种子传进去(不传播也行,我自己默认给他设置一个),下一场就nextInt()办法就足以了。多简单!”

      
  1. Random r = new Random(); 
  2. for(int i=1; i<=5; i++){ 
  3.     System.out.println(r.nextInt()); 

C老汉正要反击自以为是的Java, CPU阿甘又发言了:“不对啊,你这个随机数不符合我们老大的要求啊,这不是真实的天文数字,这是伪随机数!”

C老汉马上把注意力转移到阿甘身上:“凭什么说这是伪随机数?”

CPU阿甘说:“老大说了,要不可预测,但是你这公式,我如果知道了上一度指数,从一个指数我自己代入那个公式就足以计算出来了,在我这里,一分钟都用不了,总体可以预测。”

阿甘此言不虚,她的进度是全体计算机系统最快的。

"还有,你居然用当前时间做种子,那我也用同样的年华做种子,岂不是可以变动和你一模一样的天文数字队列?总体可以重现啊。”

C老汉连续挨了两记闷棍,团里嘟囔着,但也说不出话来了。

Linux老大赶紧和稀泥:“虽然是伪随机数,但是这个算法非常简单,对于这些对安全要求不高的现场,比如玩游戏的时节,还是异样实用之。咱们再想想,怎么变化真正的天文数字吧!”

C老汉说到:要不这样,咱们可以运用Hash函数。

  • R1 = hash(seed)
  • seed = seed + 1
  • R2 = hash(seed)
  • seed = seed + 1
  • R3 = hash(seed)
  • seed = seed + 1
  • R4 = hash(seed)
  • ......
  • CPU阿甘说:“其一艺术还行,在不知晓种子(seed)的情况下,你送我一下指数,我是心有余而力不足预测下一个之,因为随机数是hash函数生成的,是个单向的经过。但是,如果我明白了种子,那就足以变动和你一模一样的天文数字列,故此不满足‘不得重现’的特性。”

    瞧来生成真正的天文数字太难了,大家都沉默了。

    过了绵绵, vim突然说到:你们以为我说的是笑话,但是思路却是可以借鉴啊?大家想想

    他家敲击键盘的进度节奏是不是随机的?

    他家之鼠标移动是不是随机的?

    网卡每秒发送的多寡量是不是随机的?

    硬盘每秒写入的多寡是不是随机的?

    如果我们把那些随机的东西给综合起来......

    Linux老大非常喜欢:“正确,咱们可以把它们认为是机械运行的气氛噪音,我把它们收集起来放到一个池子里......”

    CPU阿甘马上接口:“下一场,可以用个Hash书法对这个池子中的内容做个消息摘要,结果就是真随机数了!散乱,无法预测,无法重现。”

    vim感觉有点不爽,这俩人也太会抢功劳了。

    C老汉也频频点头:“其一艺术妙啊,我可以修改一下我之rand函数,来获得这个值......”

    Linux老大:“别别,你的伪随机数还是要保留,上个月码农翻身公众号刚刚说过,任何皆文件,我可以变动一个奇异的公文,就叫/dev/random吧,这样程序员就足以运用最常用的open ,read等方式来调用了!”

    Linux老大说完,又感慨了一句:“终于,咱们学会掷骰子了!”

    一角下。

    CPU阿甘兴冲冲地跑来找Linux老大:老大,明朝忘了一件事,我之软件就帮腔真正的天文数字生成啊,我可以采取电阻的热噪声来生成的,是真随机数,用RdRand指令就能拥有。

    Linux老大:其一硬件是你诞生的时节就把植入了,是个黑盒子,如果NSA在里面安装了方便之门,怎么办?

    CPU阿甘看着自己之肌体,愣住了......

    【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】

    戳这里,瞧该作者更多好文

    【编纂推荐】

    1. 20元造一个运行Linux和Python的片子
    2. Java 14 都快来了,为什么还有这么多人口坚守Java 8?
    3. 12岁首Github上热门的JavaScript开源项目
    4. 必发娱乐手机版排名Top 100的Java类库——在分析了30073份源码之后得出的总结
    5. 每个极客都应当知道的Linux技术!
    【义务编辑: 武晓燕 TEL:(010)68476606】

    点赞 0
  • Linux  传感器  Java
  • 分享:
    大家都在看
    猜你喜欢
  • 视频课程+更多

    Nutanix 超融合基础架构设计规范

    Nutanix 超融合基础架构设计规范

    教授:王琦1051人口学习过

    京基础学文件上流传漏洞绕过及代码审计

    京基础学文件上流传漏洞绕过及代码审计

    教授:Margin6846人口学习过

    2019本版HCNP|HCIP-R&S|CCNP

    2019本版HCNP|HCIP-R&S|CCNP

    教授:郝旺10921人口学习过

  • &lt;code id="c444e909"&gt;&lt;/code&gt;