好的,所以我想随机分配一个数字不均匀... 所以我们说有20个我需要5个(除数)20个随机块。
4 4 4 4 4
相反,我想要像
这样的东西6 2 4 3 5
它不能超过起始编号
如何在vb中完成?
请帮助,被困了好几个小时。
答案 0 :(得分:2)
:2,$s/\t/,/g
这样称呼:
Public Iterator Function DivideUp(ByVal Number As Integer, ByVal Groups As Integer, Optional ByVal Variance As Integer = 5) As IEnumerable(Of Integer)
Dim rnd As New Random()
While Groups > 0 AndAlso Number > 0
If Groups = 1 Then
Yield Number
Exit Function
End If
If Variance > Number - Groups Then Variance = Number - Groups
Dim temp As Integer = Number / Groups
temp += rnd.Next(Variance * -1, Variance)
Yield temp
Number -= temp
Groups -= 1
End While
End Function
更传统的东西:
For Each num As Integer In DivideUp(20, 5)
Console.WriteLine(num)
Next
如果你想得到真正的幻想,你可以使用随机方差的日志或自然日志来尝试使它更接近中位数,即:如果你的数字均分为4组,你呢?希望看到2比3更难得,更难看到1而不是2?
最后,一个测试工具:
Public Function DivideUp(ByVal Number As Integer, ByVal Groups As Integer, Optional ByVal Variance As Integer = 5) As Integer()
Static rnd As New Random()
Dim result(Groups-1) As Integer
For i As Integer = 0 To Groups - 1
If Variance > Number - Groups Then Variance = Number - Groups
If i = Groups - 1 Then
result(i) = Number
Else
Dim temp As Integer = Number / Groups
temp += rnd.Next(Variance * -1, Variance)
result(i) = temp
Number -= temp
End If
Next i
Return result
End Function
如果你正在使用真钱,你需要使用加密随机数生成器(简单的Dim errorCount As Integer = 0
For i As Integer = 0 To 10000
Dim items = DivideUp(100, 12)
Dim sum As Integer = 0
For Each j As Integer In items
Console.Write(j)
Console.Write(" ")
sum += j
Next j
Console.WriteLine("Total: {0}", sum)
If sum <> 100 Then
errorCount += 1
Dim tempColor = Console.ForegroundColor
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("Error: incorrect total!")
Console.ForegroundColor = tempColor
End If
Next i
If errorCount > 0 Then
Dim tempColor = Console.ForegroundColor
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("Error: incorrect total on {0} tries!")
Console.ForegroundColor = tempColor
End If
类型不会削减它)你想要实际保存这些结果中的每一个(加上运行它的次数比只有10,000次)。然后将数据拉入R并绘制分布图,以确保事物平坦(均匀分布),没有明显的偏差。您必须为许多不同的数字/组/方差组合执行此操作。未能严格验证随机性,清除任何偏见 会导致某人在系统游戏中获胜的频率超出预期。
答案 1 :(得分:2)
这取决于您希望值的分布看起来像什么。有什么限制?比如,你是否希望它们大致相等,比如每个约占总数的1/5并且有一些变化?或者,例如,第一个桶有大约一半,第二个大约剩余的一半,等等是否可以接受和/或是可取的?是否必须有任何桶可以有0到20之间的任何数字?或者0是不可接受的值?等
鉴于这一切,我首先想到的解决方案是:
function deal(total as integer, bucket_count as integer) as buckets() as integer
dim r as new random()
dim buckets(bucket_count-1) as integer
for bx=0 to bucket_count-2
buckets(bx)=r.next(total*2/(bucket_count-bx))
total-=buckets(bx)
next
buckets(bucket_count-1)=total
return buckets
end function
我还没有测试过这段代码,请原谅我是否有错误,但基本的想法是:
我们希望每个桶达到总量的1/5。所以我为第一个桶分配0到2/5之间的随机数。然后我从运行总计中减去这个数字,并为第二个桶分配一个0到2/4左右的随机数,然后第三个桶是0到2/3之间的随机数&#39 ; s之后,第四个桶是0到2/2之间的随机数(即所有)剩下的,然后把剩下的东西放在第五个桶里。
这是否是您想要的分发类型,我不知道。它看起来应该给出合理的分布。