Visual Basic基于除数随机分割双倍

时间:2016-11-01 19:22:39

标签: vb.net random division

好的,所以我想随机分配一个数字不均匀... 所以我们说有20个我需要5个(除数)20个随机块。

  

4 4 4 4 4

相反,我想要像

这样的东西
  

6 2 4 3 5

它不能超过起始编号

如何在vb中完成?

请帮助,被困了好几个小时。

2 个答案:

答案 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之间的随机数(即所有)剩下的,然后把剩下的东西放在第五个桶里。

这是否是您想要的分发类型,我不知道。它看起来应该给出合理的分布。