精易论坛

标题: 【精易模块5.6】汇编_取随机数BUG [打印本页]

作者: 小魂    时间: 2017-8-29 22:36
标题: 【精易模块5.6】汇编_取随机数BUG
本帖最后由 小魂 于 2017-8-29 23:37 编辑

命令前已置随机种子。
取1到62006之间随机数。

出现问题:数百次随机,没有一次超过40000随机数。超过30000都极少。

又下载5.8版模块,测试10亿次,这次1到1000000之间随机,依然没有一次超过40000.
lz确实不怎么懂随机机制,但个人感觉这个
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
a整数型 
b整数型 
置随机数种子 ()
计次循环首 (1000000000, )
a = 汇编_取随机数 (1, 1000000)
如果真 (a ≥ 40000)
b = b + 1

计次循环尾 ()
编辑框1.内容 = 到文本 (b)
调试输出 (“结束”)


i支持库列表   支持库注释   
spec特殊功能支持库
情况它是有问题的。


作者: 猥琐小胖子    时间: 2017-8-29 22:49
既然都是随机,为什么就要数百次要有最少一次超过40000呢?
随机就是不可预测,哪怕连续出现重复。
作者: 小魂    时间: 2017-8-29 22:59
猥琐小胖子 发表于 2017-8-29 22:49
既然都是随机,为什么就要数百次要有最少一次超过40000呢?
随机就是不可预测,哪怕连续出现重复。

你的理解很奇怪。
超过40000的数字,占随机比例的三分之一。几百次的随机,没有一次随机到这个范围的数字,你不觉得有问题。这是几百次,不是几十次的随机。
作者: 猥琐小胖子    时间: 2017-8-29 23:05
小魂 发表于 2017-8-29 22:59
你的理解很奇怪。
超过40000的数字,占随机比例的三分之一。几百次的随机,没有一次随机到这个范围的数 ...

我的说法让你理解奇怪是因为你证明BUG方式是有问题的。

随机就是不可预测,如果按你说的那个几百次后就应该要有超过30000,那就不是随机,而是干涉下的。

你证明BUG的方式也间接说明你不懂概率。随机在那个范围本身就是有1/62006概率,除非随机出的数值抽取出来。既然你没抽取出来,那概率是一样的,几百次后没出现你说的30000是没问题的,因为概率是一样的。

简单说个例子,一枚硬币,你连续抛100次的正面,按你这证明BUG的逻辑,这枚硬币成了有BUG了。
作者: 猥琐小胖子    时间: 2017-8-29 23:06
你要说 汇编_取随机数BUG 有BUG
你应该是从 汇编_取随机数BUG 这个的代码入手,比如代码内有初始问题或者取种子问题,这才是BUG。
只靠因为几百次没出现过你范围最大值区域,就说是BUG,这样的说法是靠不住的。

作者: 镇坛道德标杆    时间: 2017-8-29 23:37
本帖最后由 junkboy 于 2017-8-29 23:42 编辑

这个命令也许确实不够分散,但是你标题中的"数百次"取样太少没有说服力,请理解“随机”二字。

需要可以用的随机数,参考我分享过的mt19937。

要求高的话用windows的CryptoAPI(我也分享过)、openssl等加密库中的随机数函数。
==================

补充:你的示范代码次数足够,说明确实是有问题的,windows的random函数的取值范围最大值是有定义的,RAND_MAX。
实际上随机数的本质是生成一个0到1的浮点数,乘以RAND_MAX,就可以得到指定范围的随机数。

作者: soulan    时间: 2017-8-30 01:44
一群扯几把蛋,按照他的代码试试不就知道代码的确有问题
作者: soulan    时间: 2017-8-30 01:48

试试这个

  
子程序名返回值类型公开备 注
取随机数汇编_整数型 
参数名类 型参考可空数组备 注
欲取随机数的最小值整数型
欲取随机数的最大值整数型
置入代码 ({ 81, 82, 15, 49, 185, 23, 0, 0, 0, 247, 225, 131, 192, 7, 139, 77, 12, 43, 77, 8, 65, 51, 210, 247, 241, 3, 85, 8, 139, 194, 90, 89, 201, 194, 8, 0 })
返回 (0)



作者: 猥琐小胖子    时间: 2017-8-30 02:20
soulan 发表于 2017-8-30 01:44
一群扯几把蛋,按照他的代码试试不就知道代码的确有问题

不要不懂装懂好吗。精易这个代码是没问题,有问题的是用的人。
--------------------
rand_max = 0x7FFF  ,按有符号能给你随机的范围是 -32768 到32767
你随机的范围中最大值是1000000,能得到?至于怎么产生超过这范围的N个语言都有库。
真搞不懂这种问题都能说是BUG。
-----------------------
你要拉货就开货车,你开跑车,装不下全部,就说这车有问题,这逻辑不搞搞笑吗。
作者: 福仔    时间: 2017-8-30 02:25
是不是bug我也不清楚,我刚刚测试了一下,1-100W 取随机数,循环100万次取,每次取出的最大值都是32768,测试了10000次,10000次都是32768
看不明白那个汇编代码,不知道他的原理是怎么样

  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
i整数型 
a整数型 
max整数型 
计次循环首 (10000, )
计次循环首 (1000000, i)
a = 汇编_取随机数 (1, 1000000)
如果真 (a > max)
max = a
如果真 (a > 400000)
调试输出 (a)

计次循环尾 ()
如果真 (max ≠ 32768)
调试输出 (“完了”, max)

计次循环尾 ()
调试输出 (“ok”)


i支持库列表   支持库注释   
spec特殊功能支持库

作者: 福仔    时间: 2017-8-30 02:39
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
a整数型 
max整数型 
min整数型 
min = 1000000000
计次循环首 (10, )
置随机数种子 ()
计次循环首 (1000000, )
a = 汇编_取随机数 (100000, 1000000000)
如果真 (a > max)
max = a
如果真 (a < min)
min = a

计次循环尾 ()
计次循环尾 ()
调试输出 (“由此可以看出,取随机数最小值和最大值之间相差 32767”, max - min, max, min)


i支持库列表   支持库注释   
spec特殊功能支持库



E自带的取随机数也是相差 32767
作者: 猥琐小胖子    时间: 2017-8-30 02:46
本帖最后由 猥琐小胖子 于 2017-8-30 02:57 编辑
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
子程序1 (1, 2147483646)
子程序1 (1, 2147483647)
子程序名返回值类型公开备 注
子程序1  
参数名类 型参考可空数组备 注
a整数型
b整数型
变量名类 型静态数组备 注
c整数型 
c = a + b
调试输出 (c)


i支持库列表   支持库注释   
spec特殊功能支持库

作者: 猥琐小胖子    时间: 2017-8-30 02:46
本帖最后由 猥琐小胖子 于 2017-8-30 02:57 编辑
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
子程序1 (1, 2147483646)
子程序1 (1, 2147483647)
子程序名返回值类型公开备 注
子程序1  
参数名类 型参考可空数组备 注
a整数型
b整数型
变量名类 型静态数组备 注
c整数型 
c = a + b
调试输出 (c)


i支持库列表   支持库注释   
spec特殊功能支持库

作者: 猥琐小胖子    时间: 2017-8-30 02:46
本帖最后由 猥琐小胖子 于 2017-8-30 02:57 编辑
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
子程序1 (1, 2147483646)
子程序1 (1, 2147483647)
子程序名返回值类型公开备 注
子程序1  
参数名类 型参考可空数组备 注
a整数型
b整数型
变量名类 型静态数组备 注
c整数型 
c = a + b
调试输出 (c)


i支持库列表   支持库注释   
spec特殊功能支持库

作者: 猥琐小胖子    时间: 2017-8-30 02:48
本帖最后由 猥琐小胖子 于 2017-8-30 02:57 编辑
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
子程序1 (1, 2147483646)
子程序1 (1, 2147483647)
子程序名返回值类型公开备 注
子程序1  
参数名类 型参考可空数组备 注
a整数型
b整数型
变量名类 型静态数组备 注
c整数型 
c = a + b
调试输出 (c)


i支持库列表   支持库注释   
spec特殊功能支持库

作者: 猥琐小胖子    时间: 2017-8-30 02:52
福仔 发表于 2017-8-30 02:39
[e=1]
.版本 2
.支持库 spec

下面这个add子程序,第2个结果为什么不是 2147483648。
按这反应BUG的逻辑,是不是要说这个add子程序加法有BUG?



作者: 福仔    时间: 2017-8-30 03:03
猥琐小胖子 发表于 2017-8-30 02:52
下面这个add子程序,第2个结果为什么不是 2147483648。
按这反应BUG的逻辑,是不是要说这个add子程序加 ...

百毒了一下随机数的原理,完全看不懂.....现在我只知道随机数范围是0-32767之间......
作者: 常飞    时间: 2017-8-30 05:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: 放过羊    时间: 2017-8-30 07:17
猥琐小胖子 发表于 2017-8-30 02:52
下面这个add子程序,第2个结果为什么不是 2147483648。
按这反应BUG的逻辑,是不是要说这个add子程序加 ...

用的什么字体?配色?字体多大号?
作者: 9876543210    时间: 2017-8-30 08:15
易语言自带的也有问题,位与1以后转换并存入逻辑型数组中,再转经过移位运算转换成字节集压缩,压缩率小于100%就是有问题的。
作者: soulan    时间: 2017-8-30 10:45
猥琐小胖子 发表于 2017-8-30 02:20
不要不懂装懂好吗。精易这个代码是没问题,有问题的是用的人。
--------------------
rand_max = 0x7FF ...


我是菜鸟,不懂你们玩的高端东西.. 只是用到那个命令取不出指定范围随机数,模块也没备注

  1. 参数<2>的名称为“欲取随机数的最大值”,类型为“整数型”,允许接收空参数数据。注明:参数必须大于或等于零。本参数如果被省略,默认为无限。
复制代码


再说,你们自己看看别人主题还有你们的回复,跟他发的主题一条道上的?,,或者是我自己闲着蛋疼了,删帖去

作者: a5005019    时间: 2017-8-30 21:27
感谢楼主分享
作者: 猥琐小胖子    时间: 2017-8-31 00:32
soulan 发表于 2017-8-30 10:45
我是菜鸟,不懂你们玩的高端东西.. 只是用到那个命令取不出指定范围随机数,模块也没备注

先回答你说的2点。
1:不懂就别乱扯蛋。另外模块确实没备注说明范围会引起问题。(但楼主提的是BUG)本身这段汇编是没问题,可以取出伪随机数。
2:回复他的内容除非告诉他这个汇编没问题,也是间接告诉他什么才是BUG。
------------
精易模块里面有个网页访问大家用得比较多。要是按他这测试逻辑,只要是用网页访问不能顺利post登陆某网站都可以来说这是网页访问问题。你要说这个网页访问有问题你应该是要指出源码哪里有问题,而不是靠你这种测试就得出。这也是一开始我说的随机概率,如果因为你说N次没出现这个随机有问题那就不是随机性了。
---------
还有,我不清楚楼主有没有看过这段汇编子程序的源码,你肯定没看过,然后随手就丢了一个置入代码说换那个。

精易模块那个汇编的随机数是微软2011年VC++ 运行库中自带的rand()函数 【我不是说微软不会出BUG,但你要说这代码有BUG你要给出可靠的数据】
作者: 小魂    时间: 2017-8-31 13:19
猥琐小胖子 发表于 2017-8-31 00:32
先回答你说的2点。
1:不懂就别乱扯蛋。另外模块确实没备注说明范围会引起问题。(但楼主提的是BUG)本 ...

谢谢,无需你告诉什么!
我就反应下遇到的情况,要是没问题,那就算了!
作者: feng78    时间: 2017-9-5 16:58
编_取随机数BU
作者: 落款hMZ    时间: 2017-9-10 04:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: gongyi22    时间: 2017-9-13 12:43
我发现BUG区的大神,真的好多啊!!!!!!!!!!!!!!!!!!!!!!!
作者: 4218164    时间: 2017-9-14 09:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: 初心不忘    时间: 2017-9-14 11:34
不错,学习了,希望楼主多多发
作者: m36i1t    时间: 2017-9-17 22:24
不错,学习了,希望楼主多多发
作者: 桐人dx    时间: 2017-9-21 20:38
看看
作者: 694768473    时间: 2017-11-17 11:39
11111111111
作者: 云淡·风轻    时间: 2017-11-19 17:56
学习了666666666666666
作者: jr21066    时间: 2017-12-14 07:37
90000000次的循环试了几十次.确实没有大于40000的

不过系统的那个取随机数更差.
不行就两次随机数相加好了
作者: 衰而不爱    时间: 2017-12-14 07:51
落款hMZ 发表于 2017-9-10 04:56
不管是汇编还是易语言的取随机数,应该都是有个透明天花板的,
你可以试试取 1 到 10 亿之间的随机数,超 ...

大神666666666666666
作者: jr21066    时间: 2017-12-14 09:01
本帖最后由 jr21066 于 2017-12-14 09:34 编辑

原代码为:.版本 2

' PUSH EBP
' MOV EBP, ESP
' PUSH ECX
' PUSH EDX
' RDTSC
' IMUL EAX, EAX, 343FDh
' ADD EAX, 269EC3h
' SHR EAX, 10h
' AND EAX, 7FFFh
' MOV ECX, DWORD PTR SS:[EBP+10h]
' TEST ECX, ECX
' JNZ SHORT Jump
' MOV ECX, 7FFFFFFFh
' @Jump:
' SUB ECX, DWORD PTR SS:[EBP+8h]
' INC ECX
' XOR EDX, EDX
' DIV ECX
' ADD EDX, DWORD PTR SS:[EBP+8h]
' MOV EAX, EDX
' POP EDX
' POP ECX
' MOV ESP, EBP
' POP EBP
' RETN 10h


数值被压缩到32767之内了.原因还不了解.如果要取大值可以把这行去掉.附下命令可修改部分.
rdtsc 为取cpu时钟周期值,会返回到edx+eax中.因edx值偏小抛弃不用.只使用eax
imul eax,eax,000343FDh
add eax,00269EC3h

这两句都是为了增加随机性进行的一些运算.可以修改为自己的任何运算.只要是分配均匀的都是好作品.
and eax,7FFFFFFFh
这个只是把负数取掉了.返回正整数.后边就是取出最大值和最小值之间的数了.不用修改



push ecx
push edx
rdtsc
imul eax,eax,000343FDh
add eax,00269EC3h
and eax,7FFFFFFFh
mov ecx,dword ptr [ebp+10h]
test ecx,ecx
jne Label1
mov ecx,7FFFFFFFh
Label1:
sub ecx,dword ptr [ebp+08h]
inc ecx
xor edx,edx
div ecx
add edx,dword ptr [ebp+08h]
mov eax,edx
pop edx
pop ecx
mov esp,ebp
pop ebp
retn 0010h


机器码: {81,82,15,49,105,192,253,67,3,0,5,195,158,38,0,37,255,255,255,127,139,77,16,133,201,117,5,185,255,255,255,127,43,77,8,65,49,210,247,241,3,85,8,137,208,90,89,137,236,93,194,16,0}


作者: 安艺轩    时间: 2018-10-6 12:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: 墨影0620    时间: 2018-11-4 22:40
jr21066 发表于 2017-12-14 07:37
90000000次的循环试了几十次.确实没有大于40000的

不过系统的那个取随机数更差.

系统的那个取随机数重复概率很高




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