实施例包括使用唯一的盐水值构造具有已知或未知基数的伪随机数生成器(PRNG)的集合,该盐水值包括用于集合的盐值以及用于集合的每个PRNG的不同索引值。此类PRNG的附加参数基于PRNG的相应盐水值,从而确保集合中的PRNG具有不同的状态循环。实施例通过为每个集合选择伪随机盐值,使得来自不同集合的PRNG可能具有不同的附加参数。根据实施例,集合中的生成器的流由拆分器创建,该拆分器携带集合的盐值并将盐值与生成器的索引值组合以在流中产生PRNG的盐处理的附加参数。根据实施例,这样的流可以由多个线程并行执行。流可以由多个线程并行执行。流可以由多个线程并行执行。
【技术实现步骤摘要】
【国外来华专利技术】使用多个具有盐处理的初始状态的生成器并行生成伪随机数序列
[0001]本专利技术涉及伪随机数生成器,并且更具体而言,涉及用于使用可拆分伪随机数生成器生成具有良好统计质量的伪随机数的集合、序列或流的计算技术。
技术介绍
[0002]许多计算算法和应用依赖于伪随机数或位串的来源,即,确定性算法、设备、处理或方法,其提供用于适当目的的看起来是由真正随机来源生成的或者表现得好像是由真正随机来源生成的数字或位串的集合、序列或流。一类利用伪随机数的应用是所谓的“蒙特卡罗”方法。另一类利用伪随机数的应用是马尔可夫链。
[0003]伪随机数来源的质量可以通过对其输出应用多种统计测试中的任一种来判断。一个广泛使用的测试是DieHarder软件套件[3]。该套件中更严格的测试之一是Marsaglia和Tsang[13]。另一个是来自NIST的统计测试套件[15]。也许当今最著名的是TestU01[16,10],包括其最严格的测试集合,称为BigCrush。另一个鲜为人知的现代测试套件是PractRand[5]。
[0004]关于用于生成伪随机数序列的顺序算法有大量的文献。一种被广泛认为质量非常高的顺序算法是梅森扭曲器(Mersenne twister)[14]。也可以通过使用被认为具有随机行为的物理处理的结果来生成“真正的”随机数。在互联网上可用的此类位的一个来源是“HotBits”生成器[20]。
[0005]伪随机数的生成与数据结构的散列值的生成之间存在密切关系。特别地,原则上可以通过将适当的散列函数应用于连续整数的流来生成伪随机数的流。一些散列函数是通过首先将大型数据结构缩减为固定大小的整数,然后应用终结器(finalizer)来构建的,终结器可以是混合函数,它“混合”用于表示整数的各个位的值。这种方法的一个示例是MurmurHash3算法[1],它在生成64位散列时使用64位终结器。Stafford[17]讨论了这个64位终结器函数的变化,这些终结器函数中的每一个都接受64位输入并产生64位结果。这些函数中的每一个都是双射的:不同的输入产生不同的结果。这些函数中的每一个还具有良好的雪崩统计,意味着平均而言,对于所有可能的输入,仅更改一位输入对于64个输出位中的每一位,大约有50%的机会更改该输出位。MurmurHash3混合函数和Stafford变体都通过应用一系列交替的xorshift步骤和乘法步骤来实现混合;对于某个整数移位距离k,xorshift步骤将输入值z变换成z XOR(z SHIFTRIGHT k),而对于某个乘数a,乘法步骤将输入值z变换成z x a。这些步骤背后的直觉是,xorshift步骤使用高阶位中的信息来修改低阶位,而乘法步骤使用低阶位中的信息来修改高阶位。换句话说,在xorshift步骤中,信息从左到右流动,而在乘法步骤中,信息从右到左流动。因此,交替这些步骤可以通过让信息在单词内来回晃动来实现良好的混合,从而最终每个输入位都可以影响每个输出位。
[0006]当并行运行时,顺序算法通常不产生具有期望统计特性的伪随机数。因此,比通过顺序方法生成伪随机数的序列更困难的问题是提供可以以这样一种方式由并行执行的多
个共享控制线程使用的确定性算法、设备、处理或方法,使得每个线程可以独立地生成伪随机数的序列,而由所有线程共同生成的单个数字集合仍然具有良好的统计特性。当使用诸如中央处理单元(CPU)集群之类的并行处理硬件执行诸如蒙特卡罗模拟之类的应用的计算时,期望具有这种确定性算法、设备、处理或方法。当使用诸如一个或多个图形处理单元(GPU)之类的向量处理或SIMD硬件执行那一类的计算时,也期望具有这种确定性算法、设备、处理或方法。
[0007]Java编程语言从其开始就包括类java.util.Random,其实例是提供nextLong()方法等的对象,该方法在调用时重复产生伪随机值的流。多年来,其设计中的一些缺点变得明显。首先,它具有相对小的周期(2
48
)。其次,它的输出没有通过DieHarder测试;换句话说,java.util.Random按照当今的标准不是很好的伪随机数生成器。第三,虽然它的方法是线程安全的,但是当被多个线程共享时,它的性能很差。第四,如果程序员试图通过为每个线程创建新的随机数生成器对象来回避第三个缺点,那么不能保证该策略将产生在统计上与由单个随机数生成器对象产生的值集合一样好的集体伪随机值集合。Java 7引入了新类java.util.concurrent.ThreadLocalRandom来解决第三个缺点。但是,它使用了与java.util.Random相同的底层数学算法,因此它仍然遭受第一、第二和第四个缺点。
[0008]Java.util.concurrent.ThreadLocalRandom的实现部分灵感来自Leiserson、Schardl和Sukha[12]所做的工作,其中他们描述了一种他们称之为DOTMIX的算法。DOTMIX允许并行运行的计算任务独立生成伪随机序列。在Leiserson、Schardl和Sukha描述的模型中,计算最初由单个任务组成,并且任何任务可能随时产生新任务、与其产生的任务同步(等待它们完成),或生成伪随机数。基本思想是每个这样的动作(spawn、sync或generate)都与唯一的“谱系”相关联,谱系是有序的整数向量。计算发生在每个spawn、sync或generate操作中,以确保所有任务执行的所有动作集合内的每个动作将具有不同的谱系。此外,generate操作通过对generate操作的谱系执行两部分数学计算来产生伪随机数:具有系数向量的点积,随后是“混合”操作,该操作在概念上“加扰”点积的结果。名称“DOTMIX”来自于点(dot)积及随后的混合(mix)函数的这个两部分处理。系数向量是在初始任务开始执行之前从固定表中提取的,理想情况下,该表是由一些真正的随机处理定义的。注意的是,点积是线性函数,当系数向量被认为是固定的时,该线性函数线性地组合谱系的元素。
[0009]Steele、Lea和Flood[7]描述了他们称之为SPLITMIX的远相关算法,该算法还允许并行运行的计算任务独立生成伪随机序列。但是,该算法并没有特别绑定到并行任务结构,也没有绑定到诸如spawn和sync之类的动作。而是,它是面向对象的:每个伪随机数生成器(PRNG)对象都包含某个状态并支持至少两个方法,generate和split。generate方法推进对象的内部状态并返回伪随机值(通常是64位整数);split方法推进对象的内部状态并返回新创建的PRNG对象。该论文基于由Leiserson、Schardl和Sukha提供的数学证明针对为什么两个对象的输出可能在统计上是独立的提供了某种数学证明。在JDK8中适于用于类SplittableRandom(Java开发工具包的第8版)的SPLITMIX版本使用每个对象的127位内部状态,以两个64位整数的形式,其中一个需要是奇数。对于一些目的,这可能是足够数量的内部状态本文档来自技高网...
【技术保护点】
【技术特征摘要】
【国外来华专利技术】1.一种计算机执行的方法,包括:接收创建伪随机数生成器(PRNG)的集合的请求;响应于接收到创建PRNG的集合的请求,通过以下方式创建PRNG的集合:生成包含第一伪随机数的盐值,以及基于包含(a)盐值的至少一部分和(b)对PRNG的集合内的相应PRNG唯一的相应索引值的相应盐水值创建PRNG的集合的每个PRNG;其中所述方法由一个或多个计算设备执行。2.如权利要求1所述的方法,还包括:接收对创建的PRNG的集合中的特定PRNG生成伪随机数的请求;其中所述特定PRNG是基于特定盐水值创建的;响应于接收到对所述特定PRNG生成伪随机数的请求,所述特定PRNG利用所述特定盐水值的至少一部分来生成伪随机数;以及所述特定PRNG返回生成的伪随机数作为对生成伪随机数的请求的响应。3.如权利要求1所述的方法,其中基于相应盐水值创建PRNG的集合中的每个PRNG包括通过使特定PRNG的附加参数包括特定盐水值的至少一部分基于所述特定盐水值来创建所述特定PRNG。4.如权利要求1所述的方法,其中:基于相应盐水值创建PRNG的集合中的每个PRNG包括基于特定盐水值创建特定PRNG,所述特定盐水值包括盐值的特定部分和对于所述特定PRNG唯一的特定索引值;所述方法还包括通过以下方式生成所述特定盐水值:确定位的数目,其中包括所确定的位的数目的一组位至少能够表示PRNG的集合的已知基数,用盐值的所述特定部分填充所述特定盐水值的表示中的第一组位,以及用所述特定索引值填充所述特定盐水值的表示中的第二组位,其中所述特定一组位中的位的数目是所确定的位的数目。5.如权利要求1所述的方法,其中:基于相应盐水值创建PRNG的集合中的每个PRNG包括基于特定盐水值创建特定PRNG,所述特定盐水值包括盐值的特定部分和对于所述特定PRNG唯一的特定索引值;所述方法还包括通过以下方式生成所述特定盐水值:在所述特定盐水值的表示中,用滑动边界索引值填充第一组位,其中第一组位的数量是预先确定的,其中滑动边界索引值识别所述特定盐水值的表示中的特定位,用所述特定索引值填充第二组位,所述第二组位的边界是所述特定盐水值的表示中的所述特定位,以及用盐值的所述特定部分填充第三组位,所述第三组位包括所述特定盐水值的表示的不在第一组位中并且也不在第二组位中的位。6.如权利要求1所述的方法,其中:基于相应盐水值创建PRNG的集合中的每个PRNG包括基于特定盐水值创建特定PRNG,所述特定盐水值包括盐值的特定部分和对于所述特定PRNG唯一的特定索引值;所述方法还包括通过以下方式生成所述特定盐水值:
设置所述特定盐水值的表示中的一个或多个第一位组中的每个位组的相应标志位,以指示相应位组包括盐值信息,其中所述一个或多个...
【专利技术属性】
技术研发人员:G,
申请(专利权)人:甲骨文国际公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。