精易论坛

标题: “汇编_取随机数”命令bug报告 [打印本页]

作者: dangerace    时间: 2019-2-25 22:24
标题: “汇编_取随机数”命令bug报告
模块版本:7.0

偶然间发现,“汇编_取随机数”命令存在bug,取得的随机数随机性非常差。
我在试用蒙特卡洛方法估算π值时,需要使用取随机数函数,以下是核心库取随机数函数的效果:

可以看到随机数取的非常均匀。再看用“汇编_取随机数”命令取到的随机数:

可以看到取出的随机数随机性非常差,非常“有规律”。
以下是我做测试所使用的代码:
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
_按钮_被单击  
变量名类 型静态数组备 注
横坐标整数型 
纵坐标整数型 
m整数型 
m = 0
标签2.标题 = “计算中...”
画板.清除 (, , , )
延时 (500)
置随机数种子 ()
画板.画矩形 (0, 0, 500, 500)
画板.画椭圆 (0, 0, 500, 500)
延时 (100)
' 画随机点
计次循环首 (到整数 (编辑框.内容), )
横坐标 = 汇编_取随机数 (0, 500)
纵坐标 = 汇编_取随机数 (0, 500)
画板.画点 (横坐标, 纵坐标, #红色 )
如果真 (求平方根 (求次方 (横坐标 - 250, 2)求次方 (纵坐标 - 250, 2)) ≤ 250)
m = m + 1

计次循环尾 ()
标签2.标题 = 到文本 (m ÷ 到整数 (编辑框.内容) × 4)
蒙特卡洛求π值.e (3.95 KB, 下载次数: 83)




作者: jr21066    时间: 2019-2-26 14:28
代码是简单的取随机.RDTSC取的时序.如果cpu够新.可以使用硬件来取随机数.

http://bbs.eyuyan.com/read.php?tid=405670

硬件取随机数.e

4.66 KB, 下载次数: 93, 下载积分: 精币 -2 枚


作者: dangerace    时间: 2019-2-26 19:18
本帖最后由 dangerace 于 2019-2-27 10:27 编辑

用”汇编_取随机数”命令生成10000个0-100的整数,对各个整数的出现次数进行了粗略分析:

从图像上看,觉得取出的随机数随机性应该还可以。
那么原文中为什么会出现非常奇特的条形图案呢?我分析可能是取横、纵坐标的前后两个取随机数命令,汇编版因为原理问题两次取出的整数变化趋势比较接近,导致横坐标和纵坐标均同时增大或减小,而不是像核心库版那样每次取数都完全“随机”,互相之间没有联系。
所以,如果程序中只使用一次汇编版的取随机数命令,则没有什么太大的问题。但是如果因为需要而连续使用汇编版的取随机数,则每次取出的数很可能会具有某种规律性。


用excel对汇编版连续生成的两个数字进行分析,重现了上面的情况,例如上图中,如果x=15,则y=2,紧接着x=16,y=3,x=17,y=4。。。。




作者: 项目部002    时间: 2019-2-27 08:38
感谢反馈,已着手处理

作者: watermelon    时间: 2019-9-29 09:47
都是高手,学习一下。。
作者: wxj213    时间: 2020-8-8 17:22
#在这里快速回蒙特卡洛求π值.复#
作者: 334065024    时间: 2023-3-4 02:32
高手,学习一下
作者: 吃泡面加不起蛋    时间: 2024-1-5 13:16
应该调用钱置随机数种子




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4