1.热门微信小程序demo源码汇总(17/12.1-7)
2.python显示数组多少列
3.源代码涉及概念
4.python可以做哪些小游戏?
5.扒一扒随机数(Random Number)的摇塞源码诞生历史
热门微信小程序demo源码汇总(17/12.1-7)
最新: 热门微信小程序demo源码下载汇总(/.8-)
热门 微信小程序demo源码下载汇总(/.1-7),乃 小程序学习分析必备资源!摇塞源码点击标题可直接跳转至下载:
新手必看: 开发者工具如何快速导入小程序demo源码教程!摇塞源码
• 微信小程序中的摇塞源码自适应宽高的计算类
• 小胖看车团-微信小程序 预览版
• [小程序源码]微信小程序-音乐播放器
• 精品微信小程序-有调
• 微信小程序 Artand Demo
• 微信小程序 外卖demo
• 微信小程序 五月天
• 微信小程序demo:家庭菜谱
• 仿丸子地球app做的微信小程序
• 微信小程序之点计算游戏
• 微信小程序-滚动+排版
• 微信小程序--小厨房
• 微信小程序demo之模仿某汽车app
• 微信小程序demo-豆瓣科幻小说
• 仿 「ONE · 一个」 的微信小程序
• 微信小程序-新华字典
• 微信小程序:查拼音
• 微信小程序TDD示例代码
• 微信小程序转盘抽奖
• 微信小程序瀑布流布局模式
• 微信小程序demo:狼人杀
• 微信小程序之点计算游戏
• 微信小程序仿QQ源码下载
• 微信小程序仿会议精灵的首页
• 微信小程序 滑动效果demo
• 微信小应用-英雄联盟(LOL)战绩查询
• 微信小程序-7天写分答微信小程序 (2M动图预警)
• 微信小程序 实战教程(全民k歌)
• 微信小程序之火车票查询
• 上门美容预约模板源码 支持选择地址、选择时间
• 仿拉勾网App小程序demo
• [小程序源码]微信小程序-贪吃蛇小游戏
• [小程序源码]微信小程序-仿今日头条
• [小程序源码]微信小程序-仿Apple Music
• 小程序餐厅模板 带完整交互源码
• [小程序源码]微信小程序-大好商城
• [小程序源码]微信小程序-GitHub
• [小程序源码]微信小程序-PigRaising
• [小程序源码]微信小程序-小熊の日记
• [小程序源码]微信小程序-妹纸浏览
• [小程序源码]微信小程序-计算器
• [小程序源码]微信小程序-音乐播放器
• [小程序源码]微信小程序-HiApp
• [小程序源码]微信小程序-公众号热门文章信息流
• [小程序源码]微信小程序-购物车Demo
• [小程序源码]微信小程序-掘金社区
• [小程序源码]微信小程序-微票
• [小程序源码]微信小程序-番茄时钟
• [小程序源码]微信小程序-豆瓣
**• 微信小程序开发的摇塞源码芒果TV示例
• 微信小程序-v2ex(wechat-v2ex)
• 集成Redux实现的Todo list
• 微信小程序-布局效果Demo
• 微信小程序仿**appdemo源码
• wechat-weapp-gank
• 基于微信小程序开发的仿微信demo
• 设计网站dribbble
• 微信小程序版打飞机源码下载
• 微信小程序外卖平台demo源码
• 针对微信小程序整合的一套UI库
• 微信小程序地图定位demo
• 微信小程序版的知乎日报
• wxapp-Breakfast()
• 微信小程序在线技术社区demo源码
• 微信小程序开发的app---礼物说APP
• 微信小程序-小波说雨燕blog
• 微信小程序demo:百度百科搜索
• 微信小程序demo:果库
• 微信小程序demo:爆米花popcorn]
• 微信小程序demo:展示美女模特福利
• 微信小程序示例 诗词demo
• 微信小程序学习用demo:附登录设计实战教程
• 微信小程序demo:仿手机淘宝
• 微信小程序demo:Dribbble
• 微信小程序推荐demo:备忘录
• 微信小程序demo:智能机器人
• 微信小程序demo:万年历
• 微信小程序demo:够野活动
• 基于面包旅行 API 制作的微信小程序示例
• 微信小程序demo:小米天气
• 微信小程序开发 辩论赛计时APP
• 微信小程序demo:桔子信用
• 微信小程序demo:京东首页
• 微信小程序demo:宅男社区
• 微信小程序demo:课程列表
• 微信小程序demo推荐:百家菜谱
• 微信小程序demo:云图音乐
• 微信小程序——乐词
• 微信小程序demo:小姨妈
• 微信小程序版的扫雷(挖金子)
• 微信小程序DEMO-A岛
• 微信小程序——会面APP
• 微信小程序之音乐播放器
• 使用TypeScript开发微信小程序的demo
• 微信小程序通知广播模式类,降低小程序开发的耦合度
• 微信小程序demo 冥想
• Weapp-labofo 共享ofo共享单车的微信小程序
• 微信小程序 番茄日记
• 教务系统 微信小程序
• 微信小程序 商城demo
• 微信小程序-哔哩哔哩排行榜
• 微信小程序版的cnode社区客户端
• 微信小程序初试:你的QQ是吉是兄?
• 类似微信电话本的一个微信小程序
• 微信小程序demo - Winne The Pool 小店
• 小程序之备忘录开发
• 用微信小程序实现的奇舞周刊
• 微信小程序-小说阅读器 附件下载
• 微信小程序-段子、趣图
• 微信小程序示例 - 剪刀石头布
• 微信小程序-旅游景区模板
• 微信小程序demo源码 水浒传
• 微信小程序 元宝币钱包
• 利用豆瓣的摇塞源码网站后台php源码图书Api做的demo
• 微信小程序开发之-
• 微信小程序-骰子游戏
• 微信小程序demo-开发订单管理,菜单,摇塞源码页面设计
• 微信小程序demo-微挂靠公司端开发,摇塞源码下拉菜单,摇塞源码联系人列表
• 微信小程序demo-百货商城小程序类demo开发源码
• 微信小程序demo-二手书设计开发:界面模板
python显示数组多少列
导读:本篇文章首席CTO笔记来给大家介绍有关python显示数组多少列的摇塞源码相关内容,希望对大家有所帮助,摇塞源码一起来看看吧。摇塞源码Python中怎样使用shape计算矩阵的摇塞源码行和列你得先安装numpy库,矩阵(ndarray)的摇塞源码shape属性可以获取矩阵的形状(例如二维数组的行列),获取的摇塞源码结果是一个元组,因此相关代码如下:
import?numpy?as?np
x?=?np.array([[1,2,5],[2,3,5],[3,4,5],[2,3,6]])
#?输出数组的行和列数
print?x.shape?#?(4,?3)
#?只输出行数
print?x.shape[0]?#?4
#?只输出列数
print?x.shape[1]?#?3
Python中怎么获取二维数组中指定列的数据。
解答:
op=open('xx.txt','r')
list=[]
forlineinop:
list.append(line)
这样第一行就是a[0]。
要取出第一行第二个字。
a[0].split('')[1]按空格分隔,函数名应该这个。
简介:
Python是一种面向对象、直译式计算机程序设计语言,由荷兰人GuidovanRossum发明于年,年发行第一个公开发行版。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
Python是纯粹的自由软件,源代码和解释器CPython遵循GPL协议。语法简洁清晰,特色之一是强制用空白符作为语句缩进。名字来源于一个喜剧,最初设计Python这种语言的人并没有想到Python会在工业和科研上获得如此广泛的使用。
python中如何表示多维数组在Python中,一个像这样的多维表格可以通过“序列的序列”实现。一个表格是行的序列。每一行又是独立单元格的序列。这类似于我们使用的数学记号,在数学里我们用Ai,j,而在Python里我们使用A[i][j],代表矩阵的第i行第j列。
这看起来非常像“元组的列表”(ListsofTuples)。
“列表的列表”示例:
我们可以使用嵌套的列表推导式(listcomprehension)创建一个表格。下面的例子创建了一个“序列的序列”构成的表格,并为表格的每一个单元格赋值。
table=[[0foriinrange(6)]forjinrange(6)]printtableford1inrange(6):ford2inrange(6):table[d1][d2]=d1+d2+2printtable程序的输出结果如下:
[[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],
[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]],
[[2,3,4,5,6,7],[3,4,5,6,7,8],[4,5,6,7,8,9],
[5,6,7,8,9,],[6,7,8,9,,],[7,8,9,,,]]
这个程序做了两件事:创建了一个6×6的全0表格。然后使用两枚骰子的皆大欢喜粤语+源码可能组合的数值填充表格。这并非完成此功能最有效的方式,但我们通过这个简单的例子来演示几项技术。我们仔细看一下程序的前后两部分。
程序的第一部分创建并输出了一个包含6个元素的列表,我们称之为“表格”;表格中的每一个元素都是一个包含6个0元素的列表。它使用列表推导式,对于范围从0到6的每一个j都创建对象。每一个对象都是一个0元素列表,由i变量从0到6遍历产生。初始化完成之后,打印输出二维全0表格。
推导式可以从里向外阅读,就像一个普通表达式一样。内层列表[0foriinrange(6)]创建了一个包含6个0的简单列表。外层列表[[...]forjinrange(6)]创建了这些内层列表的6个深拷贝。
程序的第2个部分对2个骰子的每一个组合进行迭代,填充表格的每一个单元格。这由两层嵌套循环实现,每一个循环迭代一个骰子。外层循环枚举第一个骰子的所有可能值d1。内层循环枚举第二个骰子d2。
更新每一个单元格时需要通过table[d1]选择每一行;这是一个包含6个值的列表。这个列表中选定的单元格通过...[d2]进行选择。我们将掷骰子的值赋给这个单元格,d1+d2+2。
其他示例:
打印出的列表的列表不太容易阅读。下面的循环会以一种更加可读的形式显示表格。
forrowintable:
printrow[2,3,4,5,6,7]
[3,4,5,6,7,8]
[4,5,6,7,8,9]
[5,6,7,8,9,]
[6,7,8,9,,]
[7,8,9,,,]
作为练习,读者可以试着在打印列表内容时,再打印出行和列的表头。提示一下,使用"%2d"%value字符串运算符可以打印出固定长度的数字格式。显示索引值(ExplicitIndexValues)。
我们接下来对骰子表格进行汇总统计,得出累计频率表。我们使用一个包含个元素的列表(下标从0到)表示每一个骰子值的出现频率。观察可知骰子值2在矩阵中只出现了一次,因此我们期望fq[2]的值为1。遍历矩阵中的每一个单元格,得出累计频率表。
fq=*[0]foriinrange(6):forjinrange(6):c=table[i][j]fq[c]+=使用下标i选出表格中的行,用下标j从行中选出一列,得到单元格c。然后用fq统计频率。
这看起来非常的数学和规范。
Python提供了另外一种更简单一些的ai智能客服源码方式。
使用列表迭代器而非下标,表格是列表的列表,可以采用无下标的for循环遍历列表元素。
fq=*[0]printfqforrowintable:forcinrow:fq[c]+=1printfq[2:
结语:以上就是首席CTO笔记为大家介绍的关于python显示数组多少列的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
源代码涉及概念
影片《源代码》的核心概念是平行宇宙,探讨了随机性的本质。掷骰子看似随机,但其实其结果受初始条件和环境影响,如果控制得当,其实是个确定的过程。硬币抛掷和计算机生成的随机数本质上也是伪随机,每个看似随机的结果都有其原因,形成了一种因果循环,如蝴蝶效应,每个事件的发生都有其前因,从而指向决定论的观点。 在自由意志的问题上,决定论者认为一切皆已注定,但人们在选择上仍认为自己有自由。例如,尼奥在《盗梦空间》中的选择看似自由,实则早已被决定。即便是看似微小的决定,如选择哪辆劳斯莱斯,也可能被深层次的个人信念或潜意识决定,再次验证了决定论。 量子力学的引入挑战了宏观因果律,微观粒子的状态在观察前是不确定的,这使得随机性再次进入讨论。例如,电子可能同时存在于多个位置的叠加态,直到被观测才确定。这种不确定性理论与平行宇宙论相结合,每个宇宙都有不同的历史分支,解释了《源代码》中主角柯特反复进入叠加态救赎的情况。 然而,平行宇宙的无限性导致了矛盾,每个Colter可能来自不同的平行宇宙,拥有不同的记忆,影片为了避免逻辑冲突,选择了一个默认设定。这引发的问题是,量子理论和平行宇宙究竟是智能影视解析源码加强了决定论,还是提供了对自由意志的可能解释?这取决于观察的角度:一方面,每个平行宇宙都有其必然的结果;另一方面,个体可以选择自己的生活路径,看似提供了选择的可能性。扩展资料
《源代码》Source Code是由著名导演邓肯·琼斯指导, 杰克·吉伦哈尔/ 维拉·法米加 / 米歇尔·莫娜汉 / 杰弗里·怀特 / 拉塞尔·皮特斯 / 迈克尔·阿登等人主演的一部**。讲述了一位在阿富汗执行任务的美国空军飞行员科特史蒂文斯上尉所经历的一系列惊心动魄的事件。python可以做哪些小游戏?
python小游戏,上班摸鱼必备(附源码)
1、Python程序开发之简单小程序实例()小游戏-跳动的小球项目功能用户控制挡板来阻挡跳动的小球。
2、显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:Step2:设计游戏地图利用Step1中定义的游戏精灵类,我们就可以开始设计游戏地图了。
个Python入门小程序,你都知道哪些
用程序实现石头剪刀布游戏。字典的key是姓名,value是身高,现在需要按照身高对字典重新排序。将二元二次函数封装在函数中,方便调用初学python的小伙伴注意哦~不要只依赖于教程,而忽视实操的能力。不然,是很难有进步的。
你好,python不适合做小程序的。微信官方为小程序提供了大量的接口api,开发小程序需要有基本的Javascript,HTML,CSS的基础。
python必背内容:变量。指在程序执行过程中,可变的量。定义一个变量,就会伴随有3个特征,分别是内存ID,数据类型和变量值。常量,指在程序执行过程中,不可变的量。一般都用大写字母定义常量。与程序交互。
浅浅的笑着:“我会带着你的孩子,顚节进入Python程序开发之简单小程序实例()小游戏-跳动的小球项目功能用户控制挡板来阻挡跳动的小球。
首先要明确一点,python是后台语言,不能直接用python来写微信小程序的777slots 源码。微信小程序是用javascript和css来写的。python只是用来给小程序提供后台数据用的。同样可以为小程序提供后台数据的有java和php。
Python实现消消乐小游戏1、pre{ overflow-x:auto}实现消消乐的构成主要包括三部分:游戏主体、计分器、计时器,下面来看一下具体实现。先来看一下游戏所需Python库。
2、鼠标点击切换位置。根据查询python消消乐相关资料得知,python消消乐控制横竖用鼠标点击切换位置。找出与旁边的两个图案匹配的另一个,鼠标点击切换位置,使得一行或一列至少3个相同即可消去。
3、为每一类的方块做一个对象(比如红色是一个类;蓝色是一个类……)写一个方法中,将所有方块放在一个数组中,再两个for循环遍历横纵坐标(整个游戏界面大小),将二维数组的值赋给随机一个方块类对象。
怎样用Python做一个?通过上下左右的不断移动叠加直到score累加到为止,游戏失败的条件是直至空格全部填满score,胜利的条件是score=。
可利用while循环实现,每次循环i加一,原数为a每次循环除以2,当a小于1时退出程序。while循环在每次执行循环体之前,都要先对test_expression循环条件求值,如果循环条件为真,则运行循环体部分。
0-debug.apkhelloapp-0-debug.apk安装以后是这样:话说在编译的时候可能出现空间不足的情况,根据虚拟机的不同(vmware或virtualbox)自行扩容吧。最后我们来瞧瞧简易版Python开发的这个游戏的源代码。
首先,打开python并创建一个新的PY文件。其次,importos,因为涉及系统文件的路径,因此首先在此处导入系统模块。随后,可以双击打开HTML文件,然后就可以看到书写的网页,如下图所示。
第一阶段:Python语言基础主要学习Python最基础知识,如Python数据类型、字符串、函数、类、文件操作等。阶段课程结束后,学员需要完成Pygame实战飞机大战、等项目。
Python程序开发之简单小程序实例()小游戏-跳动的小球项目功能用户控制挡板来阻挡跳动的小球。项目分析根据项目功能自定义两个类,一个用于控制小球在窗体中的运动,一个用于接收用户按下左右键时,挡板在窗体中的运动。
安装Python:在编写Python程序之前,需要在计算机上安装Python。Python官网提供了下载安装程序的链接,可以根据操作系统版本下载安装程序。编写代码:可以使用任何文本编辑器编写Python代码。
首先要明确一点,python是后台语言,不能直接用python来写微信小程序的。微信小程序是用javascript和css来写的。python只是用来给小程序提供后台数据用的。同样可以为小程序提供后台数据的有java和php。
对于学python编程的途径可以说是有两种,一种是自学,一种是到培训机构进行报名学习,python是一门编程语言,是一门可以跟计算机打交道的语言,学习python编程语言需要做的是实操而不是大量的刷题;学习时间大概是4-6个月。
使用python制作一个抽奖小游戏——骰子游戏1、汇总这个可以创建多种玩法,随机摇骰子只是其中的一种,还可以先让一个人输入一个幸运数字并储存起来,然后再执行程序,如果数字不等于幸运数字就不是幸运星,当数字等于时就是幸运星并结束程序——类似抽奖。。
2、python版的地址:DiceGame其中python版需要安装了python5才可以运行。python2的下载地址:python2朋友写了一个精美的手机版,用AdobeFlashLite完成的:BeautyDice.rar下面是游戏规则。
3、利用random函数写了个小程序。你把输入和输出与html元素连接一下应该就可以了。
扒一扒随机数(Random Number)的诞生历史
在所有的产生随机数的事物中,我认为没有什么能够超越骰子了”,这是统计学家 Francis Galton 在 年的《自然》杂志中写道。它们在容器中不断地翻滚、互相撞击,以各种形式和角度与容器壁发生碰撞,在容器中的位置和形态在外界看来都是那么不可预知,容器哪怕只发生一次晃动,外界都不可能知道里面到底是什么形态。古已有之的随机数
到底如何才能生成均匀的随机数列呢?自然界中随机性大量而近乎完美的存在,人类并不能准确地预知和量化这种随机性。迄今为止发现最早的骰子(4 个面)是来自中东的一座公元前 世纪的坟墓里。再近一些的历史是在公元前 年的中国,利用火烧龟壳产生的随机龟裂现象,一些“先知”会根据龟裂情况来对未来做判断。又过了几个世纪,在中国诞生了易经占卜法,利用 蓍草法进行占卜,其操作的分裂过程很类似于抛硬币。
机器生成随机数的第一次触碰
时间到了 世纪 年代中期,现代世界需要更多的随机数,不再是骰子或者蓍草可以满足的了。RAND 公司发明了一种机器,通过随机脉冲发生器可以生成大量的随机数。他们将这个机器运行所产生的数字聚合起来并发布成图书 “A Million Random Digits with , Normal Deviates”。这在现在看来是十分荒谬的,但是在当时却是一个突破。这是人类第一次产生如此大量的、高质量的随机数,并且对公众是开放的。这本书 RAND 公司一直印刷到了 年,现在在 亚马逊上也可以看得到。
于此类似的机器:摇奖机,是由著名的 Bletchley Park WWII 破译小组在 世纪 年代发明的,当时被用来生成英国保险债券**所使用的随机数。为了平息公众对摇奖机的公平性和准确性的质疑和担心,官方斥资制作了当时的巨型纪录片:“摇奖机的重要性(The Importance of Being E.R.N.I.E.)”。下面给出视频,很值得一看。
年随机性终于被正式规范化并且整合到了计算机 Ferranti Mark 1 号中。Ferranti Mark 1 号内置了随机数生成指令,利用电气噪声可以一次性生成 个随机比特位。这一特性是由阿兰·图灵设计的。Christopher Strachey 利用这一特点,编写了一套随机情书生成器。下面这是情书例子,利用这个程序生成的 David Link 的 复合计划:
JEWEL LOVE MY LIKING HUNGERS FOR YOUR ADORABLE INFATUATION. YOU ARE MY EROTIC ARDOUR.: MY FOND RAPTURE. MY THIRST SIGHS FOR YOUR INFATUATION. MY HEART SEDUCTIVELY WISHES YOUR BREATHLESS LONGING.YOURS CURIOUSLYM. U. C.
(由于上面文字过于漏骨,译者尝试引申出译文如下)
我对你的可爱迷恋至极。你勾起了我所有对情爱的幻想。我为你而狂热。你的魅力使我对你充满了渴望。我的心随你在而让我无法呼吸。你的追求者M.U.C
但是图灵的随机数指令几乎是当时的开发人员崩溃的,因为这种随机在本身就已经很不稳定的开发环境下又引入了不确定性。人们希望在软件中得到一致性的结果,但是用这种指令的软件永远不可能得到可重复的一致性结果,这也使得软件测试几乎变的不可行。
那么如果随机数生成器可以由一个确定性的函数来替代会怎样呢?如果在给定一个确定的初始条件,每次可以生成同样的随机序列会怎样呢?这就是伪随机数生成器(PRNG)。
伪随机数生成器(PRNG)
伪随机数生成器是由冯诺依曼在 年创造的。他的基本思想是从一个随机数种子开始,对其平方,然后取中间值。接下来重复对得到的数取平方并取中间值的过程,就会得到一个具有统计意义属性的随机数序列了。这也就是广为人知的 平方取中法。
然而,冯诺依曼的方法并没有经得住时间的考验,因为不论从什么随机种子开始,序列最终都会落入某个短循环序列,比如:,,,,,……。
序列中的数字是依赖于前一个数字的这种生成函数,上面的重复循环问题是不可避免的。但是如果说这个循环间隔非常非常大,对实际应用并不会产生影响,那会怎样呢?
年,数学家 D.H.Lehmer 利用 线性同余生成器(LCG)实现了这一思路。下面给出的是基于 Lehmer 的方法所实现的一种朴素 PRNG,叫做 中央随机数生成器,使用 JavaScript 在 年写的。
注意代码中的魔法数字(如 等),这些数字(通常是质数)是用来最大化重复区间的——上面所提到的自我重复的循环区间。这种 PRNG 使用当前时间作为种子值,重复区间可以达到 2 的 次方。
这种中央随机生成器发明之初非常流行,因为那时的 JavaScript 1.0 还没有内置 Math.random() 函数,当时的 Web 1.0 环境下,大家都想让自己的 banner 广告随机旋转。一个开发者 Paul Houle 说道:“它在很多情况下已经很好用了,但是不能使用它来做保密使用”。
对 PRNG 的更高要求
互联网确实需要保密。SSL 诞生在 年,它的加密方案需要高质量的 PRNG。它的发展也直接导致了一段时间的 PRNG 野蛮创新时期。如果你回头看一下 所有的随机数生成器的专利,你可能会感受到就像现代版的第一次制造飞机的浪潮一样。
世纪 年代中期的 CPU 是没有内置随机数生成指令的,这使得那时候好的随机种子特别难得。本来这问题也不大,不过当飞利浦的 Hallam-Baker 发现 Netscape(当时市场上的巨头)的 SSL web 服务器使用了“当前时间 + 一组特殊 ID”组合作为种子的时候,这个问题变成了一个切身体会到的安全问题了。Hallam-Baker 展示了一个攻击者很容易猜到种子值,并且对他们所拿到的服务器流量进行解密的过程。猜种子值是一个非常常规的攻击手段,尽管这种手法现在变得越来越困难。这里给出 年在 Hacker News 上的一段非常经典的攻击演练。
到了 年,计算机科学家们厌倦了生成随机数所受限的条件,来自 SGI 的一个团队发明了 LavaRand,它是用一个网络摄像头来对着熔岩灯拍照。从摄像头中过来的数据是一个真实的熵源——像图灵那样的真实随机数生成器(TRNG)——可以以 kb/s 的速率生成随机数。一如当时硅谷的风格,熔岩灯平台很快拿到了 专利。
AutoDesk 的创始人 John Walker 在全世界范围内推广他的 HotBits,这是一种“随机数即服务”的应用,背后原理是盖革计数器来保证其量子随机性。 年成立的 Random.org 为互联网提供真正的随机数。他们提供的服务包括真正的抛硬币随机、骰子随机和卡牌洗牌随机等。
上面所提到的大多数算法后来都无人问津了,但是一个叫做梅森旋转随机数生成器(The Mersenne Twister)的软件 PRNG 鹤立鸡群,它是由松本真(Makoto Matsumoto)和西村 拓士(Takuji Nishimura)在 年发明的。它完美地平衡了性能和随机数的质量,并且经受住了时间的考验。其基本思想是基于 线性反馈移位寄存器(LFSR),产生一个循环周期非常长的确定性序列,循环周期能够达到 2¹⁹⁹³⁷− 1。在当前的编程语言中,这种算法依旧是默认的 PRNG。
在 年,随机数市场发生了一个巨大的变化,Intel 在其 i 芯片组上集成了芯片级的随机数生成器。这样使得新的服务器都自带热噪声的本地源随机数生成能力——真正的随机数生成器(TRNG)。这很伟大,但是它始终没有软件 PRNG 快,所以加密软件依旧不得不依赖于伪随机数生成器(PRNG)。
这就把我们带到了“密码安全 PRNG”(CSPRNG)(这些讨厌的缩写!难怪很多人认为计算机科学很烦人)。CSPRNG 对于 SSL 特别重要。那么 CSPRNG 的原理是什么呢?这里有一份 页的论文来介绍 CSPRNG。祝你在里面阅读愉快。
不言而喻,CSPRNG 是一个强需求。梅森旋转随机数生成器并不是一种 CSPRNG,因为如果可以给定大量的先前序列样本,后面的数字是可以预计的出来。
时间再拉近一些, 年,Intel 为 TRNG 增加了 RDRAND 和 RDSEED 指令,具有 MB/s 的生产效率。但是 RDRAND 的完整性一直被质疑,里面是不是有某些缺陷?或者是为美国国家安全局内置了什么东西?没人确切地知道这个问题的答案,我猜某些地方的某些人一定知道,可是他们也一定不会公开。
开源硬件随机数生成器
(由一种硬件随机数生成器 PEDOUBLER 生成的随机数据)
近些年开源硬件 TRNG 也逐渐显露头角。它们广受欢迎得益于其设计的透明化:你可以自己构建线路,也可以用现有的组件搭建。完全的透明化使得对硬件随机数生成没有任何的担心和疑虑。 REDOUBLER和 无限噪声 TRNG是两个开源硬件随机数生成器,链接中给出他们的 Github 源码地址。
结尾
今天依旧有关于对随机数生成方法选择的争论,在操作系统内核、编程语言和安全包(如 OpenSSL 或者 OpenSSH)方面均未停止。有许多不同的算法聚焦于不同的特点上,如速度、占用空间、安全性等方面,也有一些安全专家依旧在寻找攻破已有算法的方法。但是对于我们日常的使用来讲,在大多数的操作系统中你可以放心地使用/dev/random,或者编程语言中你可以随心地使用 rand() 函数,都能给你带来很好的使用体验,并且你这么做,阿兰·图灵也会很开心。