Math 随机函数与计算百分比

Math 随机函数与计算百分比,math,random,Math,Random,使用具有以下功能的随机库: randomChance(p)返回true,概率由p表示。 randomInteger(低、高)返回从低到高(含)范围内的随机整数。 实现考虑百分比、1/4或1/3等因素的“随机选择器”的最简单方法是什么。。。我得到了一个具有键/值配对的数组。例如,“a”的值可能为2,“b”的值可能为2。两人都有1/2的机会 最大值将是数组的大小,因为它只包含唯一的项。randomChance()函数的范围在0.0-1.0之间,其中1=100%。如果我的数组大小是,那么就说4。“让4

使用具有以下功能的随机库:

randomChance(p)返回true,概率由p表示。

randomInteger(低、高)返回从低到高(含)范围内的随机整数。

实现考虑百分比、1/4或1/3等因素的“随机选择器”的最简单方法是什么。。。我得到了一个具有键/值配对的数组。例如,
“a”
的值可能为2,
“b”
的值可能为2。两人都有1/2的机会

最大值将是数组的大小,因为它只包含唯一的项。
randomChance()
函数的范围在
0.0-1.0之间,其中1=100%。如果我的数组大小是,那么就说4。“让4成为1”的最佳方式是什么

a = 2, b = 2, c = 1, d = 3
现在让它:

a = 2, b = 4, c = 5, d = 8
创建一个从1到MaxVal的随机数(最后一个键的值,本例中为8)。选择第一个键,其中Value>=RandomNum

编辑

我制作了一个小的VB.Net来展示算法和它是如何工作的。代码并不意味着:好的、优雅的、性能好的或可读的

Module Module1

    Private Class Value
        Public vOrg, vRecalc, HitCount As Integer
        Public Key As String
        Public Sub New(s, v1, v2, c)
            Key = s : vOrg = v1 : vRecalc = v2 : HitCount = c
        End Sub
    End Class

    Sub Main()

        ' set initial values
        Dim KVP() As Value = {New Value("A", 2, 0, 0),
                              New Value("B", 2, 0, 0),
                              New Value("C", 1, 0, 0),
                              New Value("D", 3, 0, 0)}
        ' recalc values
        For i = 0 To KVP.Length - 1
            If i = 0 Then KVP(0).vRecalc = KVP(0).vOrg Else KVP(i).vRecalc = KVP(i).vOrg + KVP(i - 1).vRecalc
        Next
        ' do test
        Dim r As New Random
        Dim runs As Integer = 1000 * 1000, maxval As Integer = KVP(KVP.Length - 1).vRecalc
        For i = 1 To runs
            Dim RandVal = r.Next(1, maxval + 1)
            Dim chosen As Integer = (From j In Enumerable.Range(0, KVP.Length) Where KVP(j).vRecalc >= RandVal Take 1 Select j)(0)
            KVP(chosen).HitCount += 1
        Next
        ' ouput results
        For Each kv In KVP
            Console.WriteLine("{0} was chosen with {1:F3} propability, expected was {2:F3}", kv.Key, kv.HitCount / CDbl(runs), kv.vOrg / CDbl(maxval))
        Next

        Console.ReadLine()

    End Sub

End Module
输出示例:

A was chosen with 0.250 propability, expected was 0.250
B was chosen with 0.251 propability, expected was 0.250
C was chosen with 0.124 propability, expected was 0.125
D was chosen with 0.375 propability, expected was 0.375

将randomChance()结果和数组长度相乘即可。它将为您提供[0,array_length-1]范围内的索引,您可以使用该索引访问数组

array_index = (unsigned int)(randomChance(p) * (array_length - 1));

在你的例子中,也许你的意思是“让3变成1”(而不是4)。长度为4的数组的最后一个索引是3。

我不明白你在问什么。这个“1/4或1/3等”的百分比是多少?这很简单,代码也很小,我喜欢。但是对于maxVal,如果我是正确的,那必须是所有值a、b、c、d(2+2+1+3)的总和。我是正确的,我的数学技能让人尴尬lol?maxVal是最后一个键的值(重新计算后)@igrimpe:你的解决方案是完全错误的:选择“c”的概率是4/8,这是错误的(应该是1/8)c仅在RandomVal为5时精确拾取。因为它是Val>=RandomVal为true的第一个键。因此,c被选为1/8。@G\G:I'va添加了一些示例代码。仍然相信算法是错误的?这是一个很好的解决方案,但只适用于均匀分布的密钥(每个密钥的机会相同)。当然,您可以简单地创建一个从0到maxindex的随机数。使其非均匀只是在整个数组中重复多次值,或者使randomChange()本身成为一个非均匀函数
重复多次
-me不喜欢冗余;)