我正在一个环境下编写应用程序,该环境包括:
- 36位一补数整数
- 算术运算仅限于
+
、-
、*
、/
和余数 - 没有像
AND
或OR
这样的位运算。但由于是一补数,XOR
等同于减法,NOT
等同于取反。 - 数字溢出是致命的,因此不能用于静默截断
- 是的,有条件语句:
IF/THEN/ELSEIF/ELSE/IF
。
理想情况下,我希望得到35或36位的随机整数,但25位也足够了。
我的线性同余发生器的天真实现在基于足够大的数字时会遇到溢出问题,而在使用较小的数字时只能产生少量的比特位。
我正在寻找一组数字a,c,m,以产生符合约束条件的最大位数,或者对LCG进行明智的改进以组合2个或多个数字。
作为起点,以下是我目前正在使用的内容:
*DEFINE NextRandom . min,max resultVar
* . This is a very shitty RNG. The numbers were never checked
* . for suitability for a long-period linear congruential generator.
* . But it yields numbers that look vaguely random.
*CLEAR rq
*CLEAR rr
*SET RandZ = RandZ * 169687 + 347011 . RandZ is a global var.
*DIVIDE RandZ BY 131072 GIVING rq, RandZ . Division yields a remainder
*DIVIDE RandZ BY 4 GIVING rq
*SET r0 = +[#,[#],1,1] . r0 = argument 'min'
*SET r9 = +[#,[#],1,2] . r9 = 'max'
*SET rd = r9 - r0 + 1
*DIVIDE rq BY rd GIVING rq, rr
*SET [#,[#],2,1] TO r0 + rr . return in 'resultVar'
*ENDDEFINE
如果有人关心的话,这个脚本语言是在一个名为EXEC 8的UNISYS 2200大型机操作系统中使用的符号流生成器(SSG)。
关于重要性:这个随机数生成器应用程序产生测试数据,它不会加密国家机密或核导弹代码。因此,我们谈论的是“好有但不必须”和“尽力而为”,而不是“使命至上”。我很乐意进行改进,但并不寻求最终解决方案。
RandZ
种子赋值,该值给出了我的CPU运行时间。 - Carl Smotriczresult = a1 * 2^0 + a2 * 2^9 + a3 * 2^18 + a3 * 2^27
)会怎样呢?这些9位数应该由具有不同周期的LCGs生成。如果所有周期都是互质的且互质于4,则总周期应该相当大。请注意,这只是一个快速的hack,生成的随机数将远非完美并且具有重复的模式(通过构造)。但根据您的需求,它可能足够,并且速度应该相当快。 - Carsten