当前位置: 首页 > 面试题库 >

生成给定分布的随机数

纪秋月
2023-03-14
问题内容

最重要的答案是建议使用switch语句来完成这项工作。但是,如果我要考虑的情况很多,那么代码看起来就很笨拙。我有一个巨大的switch语句,在每种情况下都一遍又一遍地重复非常相似的代码。

当您要考虑的概率很大时,是否有更好,更干净的方法来选择具有一定概率的随机数?(例如〜30)


问题答案:

这是一个Swift实现,受各种答案的影响很大,这些答案会生成具有给定(数字)分布的随机数

对于 Swift 4.2 / Xcode 10 和更高版本(嵌入式解释):

func randomNumber(probabilities: [Double]) -> Int {

    // Sum of all probabilities (so that we don't have to require that the sum is 1.0):
    let sum = probabilities.reduce(0, +)
    // Random number in the range 0.0 <= rnd < sum :
    let rnd = Double.random(in: 0.0 ..< sum)
    // Find the first interval of accumulated probabilities into which `rnd` falls:
    var accum = 0.0
    for (i, p) in probabilities.enumerated() {
        accum += p
        if rnd < accum {
            return i
        }
    }
    // This point might be reached due to floating point inaccuracies:
    return (probabilities.count - 1)
}

例子:

let x = randomNumber(probabilities: [0.2, 0.3, 0.5])

返回概率为0.2的0,概率为0.3的1,概率为0.5的2。

let x = randomNumber(probabilities: [1.0, 2.0])

以1/3的概率返回0,以2/3的概率返回1。

对于 Swift 3 / Xcode 8:

func randomNumber(probabilities: [Double]) -> Int {

    // Sum of all probabilities (so that we don't have to require that the sum is 1.0):
    let sum = probabilities.reduce(0, +)
    // Random number in the range 0.0 <= rnd < sum :
    let rnd = sum * Double(arc4random_uniform(UInt32.max)) / Double(UInt32.max)
    // Find the first interval of accumulated probabilities into which `rnd` falls:
    var accum = 0.0
    for (i, p) in probabilities.enumerated() {
        accum += p
        if rnd < accum {
            return i
        }
    }
    // This point might be reached due to floating point inaccuracies:
    return (probabilities.count - 1)
}

对于 Swift 2 / Xcode 7:

func randomNumber(probabilities probabilities: [Double]) -> Int {

    // Sum of all probabilities (so that we don't have to require that the sum is 1.0):
    let sum = probabilities.reduce(0, combine: +)
    // Random number in the range 0.0 <= rnd < sum :
    let rnd = sum * Double(arc4random_uniform(UInt32.max)) / Double(UInt32.max)
    // Find the first interval of accumulated probabilities into which `rnd` falls:
    var accum = 0.0
    for (i, p) in probabilities.enumerate() {
        accum += p
        if rnd < accum {
            return i
        }
    }
    // This point might be reached due to floating point inaccuracies:
    return (probabilities.count - 1)
}


 类似资料:
  • 问题内容: 我有一个具有不同值的概率的文件,例如: 我想使用此分布生成随机数。是否存在处理此问题的现有模块?自己编写代码是很简单的(构建累积密度函数,生成随机值[0,1]并选择相应的值),但似乎这应该是一个常见问题,并且可能有人为它创建了一个函数/模块它。 我需要这个,因为我想生成一个生日列表(不遵循标准模块中的任何分布)。 问题答案: 可能就是你想要的。你可以通过values参数提供概率。然后,

  • 我试图找到一种有效的算法来生成一个给定节点数的简单连通图。类似于:

  • 本文向大家介绍Java 生成给定范围内的随机数,包括了Java 生成给定范围内的随机数的使用技巧和注意事项,需要的朋友参考一下 为了生成给定范围内的随机数,Java代码如下- 示例 输出结果 名为Demo的类包含主要功能。在这里,将创建一个新的随机实例以及一个新的数组列表。创建随机元素并将其分配给变量。使用add函数将这些随机变量添加到列表中。这些元素显示在控制台上。

  • 本文向大家介绍C#生成给定范围内的随机整数,包括了C#生成给定范围内的随机整数的使用技巧和注意事项,需要的朋友参考一下 示例 生成一个介于minValue和之间的随机数maxValue - 1。            

  • 问题内容: 我需要从给定范围生成随机的BigDecimal值。用Java怎么做? 问题答案:

  • 问题内容: 我有一个问题,我想使用概率分布生成一组1到5之间的随机整数值。 泊松和逆伽玛是两个分布,它们显示了我所追求的特征(多数情况下为平均值,较少的较高数)。 我正在使用Apache Commons Math,但不确定如何使用可用的分布来生成所需的数字。 问题答案: 从问题描述中,听起来好像您实际上想要从离散的概率分布中生成样本,并且您可以将其用于此目的。为每个整数选择适当的概率,也许类似以下