我在功能写一个36位的随机数发生器
- 36位的补码整数
- 算术限于
+
,-
,*
,/
和余 - 的环境中编写的应用程序没有像
AND
或OR
这样的操作。但由于补全,XOR
相当于减法和NOT
否定。 - 数字溢出是致命的,所以不能用于静默截断
- 是的,有条件:
IF/THEN/ELSEIF/ELSE/IF
。
理想情况下,我想35或36位随机整数,但25位就足够了。
linear congruential generator我的天真实现如果基于足够大的数字并且在使用较小的数字时只产生少量的比特就会溢出。
因此,我正在寻找一组数字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
万一有人关心,脚本语言是SSG(符号流发生器)在UNISYS 2200大型机操作系统称为EXEC 8.
关键问题:该RNG工作的应用程序生成测试数据。这不是加密国家机密或核导弹编码。所以我们谈论的是“很高兴有”和“尽力而为”,而不是“关键任务”。我会很高兴有一个改进,但不是在寻找最终的解决方案。
你有条件吗? – Pubby 2013-02-14 11:40:22
通过运行现在生成的种子价值,您可以改进现有产品。 – 2013-02-14 12:27:56
@Pubby:是的,有IF/THEN/ELSE/ENDIF。我要更新我的问题以反映这一点,谢谢! – 2013-02-14 12:43:29