这个算法来源于 ((北京交通大学中国铁道科学研究院)):https://www.doc88.com/p-5405273318696.html

简介:这个算法是用来生成随机订单号的算法。

对于这个算法,自己的理解以及代码实现:https://blog.csdn.net/star1210644725/article/details/100169386

原文是英文版的,自己英语不太好,就用有道词典翻译了一下:

一种简单的生成伪随机数的方法

PanXianzhong(北京交通大学中国铁道科学研究院)

文摘:介绍了一种新方法叫做Disordering-Digit法(DDM)生成随机数,这不仅可以产生数字随机也不可重复的不同于其他RNG(随机数生成)方法以数学或物理手段,DDM很简单实现,可以运行在非常高的速度在计算机编程。简单和不可重复是DDM最突出的两个特性。最后给出了DDM的具体实现方法,并对其良好的统计特性进行了描述,最后给出了DDM在中国订票系统中生成旅客订单号的实例

关键词:随机数,数字无序,不可重复,订票系统

1  Introductior

随机数在许多信息系统中得到了广泛的应用。数学和计算机科学中已有许多生成随机数的算法和物理生成器,如同余算法、Fibonacci和Tausworthe序列、多素数生成器和混沌映射[1]。然而,几乎所有的算法都不能保证长时间内不生成相同的数字,生成的数字都是“伪随机数”。物理发生器可以产生真正的随机数,这些随机数是绝对不可预料和不可重复的,但它严重依赖于材料和环境等许多内部和外部因素,实现起来非常不容易。DDM是根据一个不断增长的连续数字序列对数字的数字进行无序排列,从而产生随机数。没有任何复杂的数学公式和函数,无序规则是很容易理解的,可以作为一个足够快的手段在许多情况下。虽然DDM产生的数字是伪随机数,但是根据一定的已知规则。它们在两个特征上与真随机数相同。首先,生成的每个数字在其最大值范围内不会出现超过一次。第二,它们是均匀分布的,没有周期规律。

2 DDM

算法细节对连续数的数字进行无序排列是DDM的基本算法。该方法的三个tep分别为:

生成连续数字对于任何信息系统,都很容易生成连续的数字,例如Sybase数据库表的标识列以及各种计算机计数器。如果我们想要在(1.999)中得到不可重复的数字,通常的方法是从1到999依次生成数字,即这样一个数组:1.2.3.4……97.998,999。它们绝对是不可重复的,但绝不是随机的。每个人都知道下一个数字是什么。

制定一个顺序数字规则如我们所知,数字是由数字组成的,称为单位'数字,十'数字等。例如,数字417有三个数字,单位的数字是7,十位的数字是1,百位的数字是4。如果我们想要数字417呈现一个完全不同的面貌,我们不需要改变所有的数字,我们只需要打乱它们。如果无序规则是“个位移到十位,十位移到百位,百位移到个位”,那么我们得到一个新的174。

关于这个无序规则有两个问题。首先,我们不能用同样的规则打乱所有的数字。选择以下5个数字作为示例:123,124,125,126,127。如果我们用同样的规则对他们的数字进行排序,比如“单位的数字移到十位,十位移到百位,百位移到单位位”,结果是:231,241,251,261,271。显然,我们可以很容易地猜到下一个数字是281。其次,我们也不能用完全不同的规则来扰乱它们。选择以下两个数字作为示例:123,321。如果我们障碍123年由“单位搬到十位,十位搬到几百的数字,几百位搬到单位的数字”规则,和混乱321年由“单位的数字搬到单位的数字,十位搬到几百的数字,几百位搬到十位数”规则,然后我们得到同样的结果:231年。根据这个规则,231会出现两次。如果是这样,无序的数字就不是

首先,我们用不同的规则打乱它们。其次,对于那些数字和相等的数,我们用同样的规则对它们进行排序。以上面的例子为例,我们把123和321按照相同的“单位数移到十位,十位移到百位,百位移到单位数”的规则排列得到231和213。它们都是不可预料和不可重复的。为了遵守以上两条规则,我们应该用不同的排列组合尽可能多地制定不同的无序规则,并确保相同的规则适用于相同的数字和数字。对于I到999之间的数字,最大的数字999是一个3位的数字。当我们通过在小于3位的umber的最前面加上0(比如1变成001,12变成012)来得到所有由3位组成的数之后,我们就有了3位来打乱所有的f。三个位有6个排列组合:123.132.213.231.312.321。所以我们最多有六条无序规则。假设1代表单位位,2代表十位,3代表百位,这六条规则被描述为:123:单位位移动到百位,十位移动到十位,百位移动到单位位。132:单位数移到百位,百位移到十位,十位移到单位数。213:十位移到百位,个位移到十位,百位移到个位。231:十位移到百位,百位移到十位,个位移到个位。312:百位移到百位,个位移到十位,十位移到个位。321:百位移动到百位,十位移动到十位,单位移动到单位。

在实际情况下,如何将失序判定为一个不为人知的秘密规则

产生的连续数的无序在制定了无序规则之后,我们将它们应用于每一个产生的连续数字。以(1999)中的数字为例,每一个数字都可以被六条规则中的一条打乱。规则和结果如表2-1所示。

3 DDM产生随机数的统计特征

好的随机数具有均匀分布、独立、周期长、速度快、效率高等统计特性。首先,DDM产生的随机数在一定范围内均匀分布。其次,在无序之前,它们是连续的。但经过不同的无序。规则是不可预料的,它们之间没有任何关系。第三,周期与最大值一样长。也就是说,(1.999)中的随机数在999之后会重复。在它的周期中,每个数字只出现一次。第四,没有任何复杂的计算,DDM能显著提高效率也就不足为奇了。

4、DDM的一个真实案例

订票系统(TRS)是一种旅客输入出行需求,如发车日期、发车城市、目的地城市、指定列车、座位类型、票号等信息的订票系统。然后系统根据需求因素占有特定的席位。如果占领成功,系统将以订单形式记录旅行信息的详细信息,并向乘客提供订单号。其他时间在售票处提供订单号,乘客可以获得纸质车票作为乘车证。

如何生成订单号曾经是一个两难的问题。订单号作为唯一的购票密钥,实际上是购票密码。不可猜测是必要的特性。此外,不同的数字代表不同的票,相同的数字必须对应相同的票。如果系统为两个以上不同的乘客生成相同的订单号,他们在索要纸质机票时会感到困惑。因此不可重复是TRS 4.0版本的另一个必要特性,订单号由Sybase数据库现有的rand()函数生成。这是随机的,但同样的数字偶尔会出现两次或更多,票务代理必须与乘客确认旅行细节,以便挑选出正确的号码。为了避免这个问题,在TRS的5.0版本中。订单号连续生产。这是不可重复的,但也是可以猜测的。订单37511936的乘客可能很容易猜到之前的订单37511935。37511934等。然后,他/她将通过提供猜测的订单号来获取其他乘客的机票。为了解决这个问题,在5.0版本中,在预订过程中需要一个来自乘客的真实密码。要打印纸质票,需要订单号和密码。在这种情况下,乘客必须一次性记住订单号和密码

由于时间每毫秒都在增长,直接使用当前计算机的日期和时间作为订单号是一种看似可行的方法,比如201307181138420。但是计算机系统的最小时间片是毫秒,并且在仅仅一毫秒内,就保留了一百多个订单。此外,用这种方法产生的数字太长。

DDM是一种生产TRS订单号的合适方法。假设我们想要8位的序号。

首先,我们创建一个数据库表来生成和保存每个预订业务的连续编号。表A的一列被设置为标识列。它可以自我增长。每次插入一行时间隙为1。我们为列设置了一个初始值,比如12345678。然后每次预约操作,我们都得到连续的数字:12345678,12345679,12345680,12345681,12345682…直到99999999类推。

其次,对表生成的8位数字进行无序化处理。8位有8*7*6*5*4*3*2*1 = 40320个排列组合。8位数字的最大个数是99999999,所以8位数字的最大和是9+9+9+9+9+9+9+9 +9+9 = 72。我们从40320个排列和组合中随意制定了72条无序规则,如81654237、72345618、62345178、53271468、85732146等。

根据数字的和,我们将72条无序规则中的一条应用于生成的连续数。为例。我们打乱了上面提到的五个连续数字:12345678、12345679、12345680、12345681、12345682。表4-1列出了这些数字的和以及它们所应用的无序规则,以及新数字的结果。

在这种情况下,我们可以很容易地得到I到99999999之间的随机和不可重复的数字,在试运行过程中,效果非常令人满意。在4.0和5.0版本中出现的问题都得到了很好的解决。然后,这种方法被推广到铁路订票的其他渠道,如电话、互联网和短信。我们希望它在TRS方面的成功将使其在其他信息系统中得到广泛的应用。

参考文献

1杨子强,魏恭义,<几种新的兰德数生成方法的研究综述>,《数值计算》《方法与计算机应用》,2001年9月,第3期在对团购票销售与预订系统进行研究,总结了团购票预订系统的设计规范。北京,中国铁道科学研究院,20043售票订票系统研究小组,中铁车站订票系统V5.0操作手册,北京,中铁出版社,2006

一种简单的生成伪随机数的方法(翻译)相关推荐

  1. 一种简单的生成伪随机数的方法

    论文原文:https://www.doc88.com/p-5405273318696.html 我对原文的翻译:https://blog.csdn.net/star1210644725/article ...

  2. LVC | 一种简单的小样本目标检测方法

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界,本文解读一下 Label, Verify, Correct (LVC):一种简单的小样本目标检测方法.   本文的 ...

  3. python图表制作方法_Python中一种简单的动态图表制作方法

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了Python中一种简单的动态图表制作方法. 数据暴增的年代,数据科学家. ...

  4. java 调用关系_【Java基础】几种简单的调用关系与方法

    直接上代码吧. class lesson4AB //同一个类下的public修饰的方法A,B可以相互调用 { public void A() { B();//等价于this.B(); } public ...

  5. CSS里总算是有了一种简单的垂直居中布局的方法了

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head><me ...

  6. 利用计算机可产生随机数,一种利用计算机生成随机数的方法

    一种利用计算机生成随机数的方法 (2012-07-16 23:22:33) 标签: 随机数 函数 数值 计数器 程序运行 杂谈 这里介绍一种利用计算机生成随机数的方法,微机都有系统计数器记录自运行开始 ...

  7. 怎么录屏幕视频,不要错过这4种简单的电脑录屏方法

    屏幕截图和屏幕录制是我们日常生活中常用的一种手段.比如把自己感兴趣的视频录下来和朋友们分享,或者录制操作视频教程让大家知道怎么做.那怎么录屏幕视频,今天在这里小编为大家推荐4种简单的电脑录屏方法,有需 ...

  8. 视频怎么做成GIF表情包?教你两种简单好用的制作方法

    怎么把视频制作成GIF表情包呢?制作表情包最大的好处是可以让你的聊天更有趣.表情包可以表达更多的情感和语气,让聊天更加生动活泼.相信大家对此都深有体会,每当网络上出现热梗的影视片段,就会有非常多的相关 ...

  9. 一种简单实用的全屏方法

    实现程序全屏幕显示的思路有很多种,最常见的一种就是: 1)利用Windows API提供的一个结构体WINDOWPLACEMENT来存储全屏显示前视图和主框架窗口在屏幕上的位置和显示信息.非客户区窗口 ...

  10. 两种简单的网页图片替换方法

    网站具体是由图片.文字.视频组成的,现在搭建网站,一般都是利用模板建站的方式去做,那么我们拿到模板以后,想要去对这个模板一些图片位置进行修改,应该怎么去做呢?那么基于wordpress的模板建站方式, ...

最新文章

  1. 实现点击下载文件的几种方法
  2. DFS产生的ID=13562事件
  3. python pandas读取excel-python pandas 读取文件 写入文件excel
  4. SAP Hybris安装包里自带的apache ant
  5. 大一新生计算机课word知识,大学新生计算机基础分层考试结果探析与启发.doc
  6. 自动安装虚拟机之网络安装和pxe安装
  7. 之前项目从未写过的PO2VO
  8. BOM 之 screen history
  9. 基于 Electron 做视频会议的两种实现方式
  10. MySQL查询优化和索引优化学习笔记
  11. 【技术美术图形部分】2.1 色彩空间
  12. linux工程师前景_嵌入式Linux工程师发展前景 嵌入式工程师待遇怎样?
  13. bzoj4246: 两个人的星座
  14. matlab自动变量名,matlab中如何自动给变量命名?
  15. JAVA初学者必备的基础书籍
  16. jt2go嵌入html控件,JT2Go(JT文件阅读器) 免费版v11.2
  17. 编辑审稿时不会从头看到尾!所以论文应该这样写……
  18. 阴阳师服务器无法显示,阴阳师服务器崩了修复了吗 突然出现无法登陆
  19. 怎么使用ArcGIS进行坡度和坡向分析
  20. Java中一年有几周、周的计算

热门文章

  1. MapReduce学习一些笔记
  2. Python之爬取58同城在售楼盘房源信息
  3. ios 模拟器沙盒_ios 模拟器沙盒的位置 | 学步园
  4. jquery fadeOut 异步
  5. 不花一分钱申请免费域名和ssl证书
  6. 2.深入解析Javascript异步编程
  7. c语言msgbox函数,msgbox函数的返回值类型为什么
  8. 《红楼梦》的香气空白
  9. TCP 糊涂窗口综合症
  10. 【深度学习——BNN】:二值神经网络BNN——学习与总结