找回密码
 加入
搜索
查看: 6270|回复: 14

[AU3基础] 【已解决】如何使随机数分布更随机,且限制其“累加和”在一个范围内

 火.. [复制链接]
发表于 2011-10-30 20:56:55 | 显示全部楼层 |阅读模式
本帖最后由 xiehuahere 于 2011-10-31 14:20 编辑

拜读了P版关于随机数的精辟论述 - 这里
自己练习一下:
#Include <Date.au3>
$max = 500
Dim $rand[10]
SRandom(_Date_Time_GetTickCount())
For $i = 0 To 9
        If $i = 0 Then
                $rand[0] = Random(0, $max, 1)
        Else
                $max -= $rand[$i-1]
                $rand[$i] = Random(0, $max, 1)
        EndIf
        ConsoleWrite($rand[$i] & " ")
Next
多次运行可以看出,基本上大数都集中在前面几个数字,后面的数字经常就是0。
如何使得分布更随机呢?
不一定要平均分布,而是说,使得前面出现大数和后面出现大数的概率一样高(数学没学好啊,不知道说明白了没)。
PS: 根据4#提供的方法增加了au3代码的语法颜色显示。
发表于 2011-10-30 21:03:37 | 显示全部楼层
为什么一定要颜色显示?我到现在还没有学会呢!
发表于 2011-10-31 02:15:12 | 显示全部楼层
看了P版的那个。我也受教了。
发表于 2011-10-31 09:46:34 | 显示全部楼层
本帖最后由 drunk 于 2011-10-31 09:48 编辑
"[au3]代码[/au3]"这样就会高亮显示了

评分

参与人数 1金钱 +10 收起 理由
chamlien + 10 终于学会了,哈哈

查看全部评分

发表于 2011-10-31 09:48:48 | 显示全部楼层
第9行是什么意思?
 楼主| 发表于 2011-10-31 09:56:25 | 显示全部楼层
本帖最后由 xiehuahere 于 2011-10-31 10:00 编辑

回复 5# 3mile


    为了保证“累加和”限制在500以内,每生成一个随机数,就减去这个数字,用剩下的作为最大值来生成下一个随机数。
   比如,第一个随机数范围rand[0]范围在[0, 500],第二个rand[1]范围就是[0, 500-rand[0]]。。。这样就能保证10个随机数的“累加和”不超过500。

   这个方法必然会导致后面的随机数越来越小。就是想请教有没有其他方法,能保证“累加和”的限制,又能使得出现大数的概率较为平均。
 楼主| 发表于 2011-10-31 10:05:08 | 显示全部楼层
回复 4# drunk

谢谢,了解了。
发表于 2011-10-31 11:02:22 | 显示全部楼层
回复 6# xiehuahere
如果最大数不能大于500的话,最平均的分部应该是50*10.也就是说,如果前面任意出现一个比较大的随机数的话(比如251)将直接导致数字池中可以使用的数字减少,所以会出现1楼中数据越来越小,直致无限接近或等于0.
以下代码只是一个变通,逻辑较简单。
#Include <Date.au3>
#include <array.au3>

$max = 50
Dim $rand[10]
SRandom(_Date_Time_GetTickCount())
$rand[0]=Random(0,$max,1)
$temp=$rand[0]
For $i = 1 To 9                
        $max=Int((500-$temp)/(10-$i))
        ConsoleWrite($max&@TAB&$temp&@CRLF)
    $rand[$i] = Random(0, $max, 1)
        $temp+=$rand[$i]
Next

Local $add

For $i=0 To UBound($rand)-1
        $add+=$rand[$i]
Next
_ArrayDisplay($rand,"结果:"&$add)
发表于 2011-10-31 12:45:50 | 显示全部楼层
回复 5# 3mile

原始值按原始值减某一值自更新
 楼主| 发表于 2011-10-31 12:49:26 | 显示全部楼层
回复 8# 3mile

谢谢!比我那个效果好些。
但这样也就限制了一开始的数据不能很大(而这样的限制是不想要的)。
我的想法是,能不能不要按部就班地从0-9依次分配,如果这个分配的顺序也是随机的,那就可以彻底解决这个问题。
发表于 2011-10-31 13:14:29 | 显示全部楼层
回复 10# xiehuahere
从15行起增加以下代码乱充数组:
For $i=1 To UBound($rand)*2
        _ArraySwap($rand[Random(0, Ubound($rand) - 1, 1)], $rand[Random(0, Ubound($rand) - 1, 1)])
Next

评分

参与人数 2金钱 +40 收起 理由
流浪的灵魂 + 20 膜拜的不光是技术,主要是那种精神
xiehuahere + 20 这个是关键。

查看全部评分

 楼主| 发表于 2011-10-31 14:18:45 | 显示全部楼层
回复 11# 3mile


   先生成数组,然后再打乱。    厉害,我怎么就没想到呢!
   思维定势害死人。
   搞定,多谢!
发表于 2012-9-21 23:09:31 | 显示全部楼层
有点笨不太理解累加什么意思,要让随机数更随机有个思路。例如要得到1-10的随机数:random(1,1000)/100然后取整数。
发表于 2012-9-21 23:09:35 | 显示全部楼层
有点笨不太理解累加什么意思,要让随机数更随机有个思路。例如要得到1-10的随机数:random(1,1000)/100然后取整数。
发表于 2016-5-31 20:47:14 | 显示全部楼层
回复 14# liqihont

这个其实也做不到更加随机
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 14:03 , Processed in 0.098749 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表