【已解决】如何使随机数分布更随机,且限制其“累加和”在一个范围内
本帖最后由 xiehuahere 于 2011-10-31 14:20 编辑拜读了P版关于随机数的精辟论述 - 这里
自己练习一下:#Include <Date.au3>
$max = 500
Dim $rand
SRandom(_Date_Time_GetTickCount())
For $i = 0 To 9
If $i = 0 Then
$rand = Random(0, $max, 1)
Else
$max -= $rand[$i-1]
$rand[$i] = Random(0, $max, 1)
EndIf
ConsoleWrite($rand[$i] & " ")
Next多次运行可以看出,基本上大数都集中在前面几个数字,后面的数字经常就是0。
如何使得分布更随机呢?
不一定要平均分布,而是说,使得前面出现大数和后面出现大数的概率一样高(数学没学好啊,不知道说明白了没)。
PS: 根据4#提供的方法增加了au3代码的语法颜色显示。 为什么一定要颜色显示?我到现在还没有学会呢! 看了P版的那个。我也受教了。 本帖最后由 drunk 于 2011-10-31 09:48 编辑
"代码"这样就会高亮显示了 第9行是什么意思? 本帖最后由 xiehuahere 于 2011-10-31 10:00 编辑
回复 5# 3mile
为了保证“累加和”限制在500以内,每生成一个随机数,就减去这个数字,用剩下的作为最大值来生成下一个随机数。
比如,第一个随机数范围rand范围在,第二个rand范围就是]。。。这样就能保证10个随机数的“累加和”不超过500。
这个方法必然会导致后面的随机数越来越小。就是想请教有没有其他方法,能保证“累加和”的限制,又能使得出现大数的概率较为平均。 回复 4# drunk
谢谢,了解了。 回复 6# xiehuahere
如果最大数不能大于500的话,最平均的分部应该是50*10.也就是说,如果前面任意出现一个比较大的随机数的话(比如251)将直接导致数字池中可以使用的数字减少,所以会出现1楼中数据越来越小,直致无限接近或等于0.
以下代码只是一个变通,逻辑较简单。
#Include <Date.au3>
#include <array.au3>
$max = 50
Dim $rand
SRandom(_Date_Time_GetTickCount())
$rand=Random(0,$max,1)
$temp=$rand
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) 回复 5# 3mile
原始值按原始值减某一值自更新 回复 8# 3mile
谢谢!比我那个效果好些。
但这样也就限制了一开始的数据不能很大(而这样的限制是不想要的)。
我的想法是,能不能不要按部就班地从0-9依次分配,如果这个分配的顺序也是随机的,那就可以彻底解决这个问题。 回复 10# xiehuahere
从15行起增加以下代码乱充数组:For $i=1 To UBound($rand)*2
_ArraySwap($rand, $rand)
Next
回复 11# 3mile
先生成数组,然后再打乱。 厉害,我怎么就没想到呢!
思维定势害死人。
搞定,多谢! 有点笨不太理解累加什么意思,要让随机数更随机有个思路。例如要得到1-10的随机数:random(1,1000)/100然后取整数。 有点笨不太理解累加什么意思,要让随机数更随机有个思路。例如要得到1-10的随机数:random(1,1000)/100然后取整数。 回复 14# liqihont
这个其实也做不到更加随机
页:
[1]