【问题标题】:Generate a random boolean 70% True, 30% false生成一个随机布尔值 70% True, 30% false
【发布时间】:2017-10-30 23:41:16
【问题描述】:

我有以下生成随机布尔值的函数。 选择方向:函数(){

 var random_boolean = Math.random() >= 0.5;
    if (random_boolean) {
        trade.call()
        prev_trade.goingUp = true
        console.log('Trade: CALL!!!!!!!!!!!!!!!!!!!!!!')
    } else {
        trade.put()
        prev_trade.goingUp = false
        console.log('Trade: PUT!!!!!!!!!!!!!!!!!!!!!!!!')
    }
}

但是,我需要分配不公平。更具体地说,我希望输出 70% 的时间为真,30% 的时间为假。

【问题讨论】:

标签: javascript random


【解决方案1】:

你只需要< 0.7,而不是>= 0.5

var random_boolean = Math.random() < 0.7;
// 70% this will be true, 30% false

正如@plasmacel 评论的那样,Math.random() 返回一个介于01 之间的值(包括0,但不包括1[0, 1)),因此我们这样做&lt; 0.7

【讨论】:

  • @Ionica 谢谢!
【解决方案2】:

让我们考虑一件事。 Math.random() 给你一个伪随机数。

试试这个功能:

function randomTest(triesCount) {
    var sum = 0;
    for(var i = 0; i < triesCount; i++){
        sum += Math.random();
    }
    return sum / triesCount;
}

如果您尝试使用不同的tryCount 参数,结果将是:

  • randomTest(100) - 0.5189474703446081
  • randomTest(100) - 0.5189474703446081
  • randomTest(1000) - 0.4973368682657417
  • randomTest(10000) - 0.5001058467610172
  • randomTest(100000) - 0.4987280984186288
  • randomTest(1000000) - 0.4999987387801045
  • randomTest(10000000) - 0.49998292815655454
  • randomTest(100000000) - 0.500079160302315

因此,您可以将结果设置为 0.5,这意味着这不是此处生成的随机数。

虽然你的问题的答案是

var random_boolean = Math.random() >= 0.3;

正如 Ionică Bizău 所说。

但请记住,它是伪随机数!

【讨论】:

  • 从某种意义上说它是伪随机的,它只生成 0 到 1 之间的数字。数字的真正随机性生成意味着生成介于 -infinity 和 +infinity 之间的数字,人类和计算机都无法模拟
【解决方案3】:

这是我用typescript 制作的版本。可以轻松删除变量类型以将其转换为javascript

//Usage
let randomBoolean = randomPercentForTrue(70)

export function randomPercentForTrue(percentage: number): boolean {
    return randomNumber(1, 100) <= percentage
}

export function randomNumber(minValue: number, maxValue: number): number {
    return Math.floor(Math.random() * (maxValue - minValue + 1)) + minValue
}

这些方法已经过各种用例的严格测试。以下是 mocha 的测试用例:

it('randomPercentForTrue with 95% accuracy', function() {
    let results0: boolean[] = []
    let results1: boolean[] = []
    let results2: boolean[] = []
    let results3: boolean[] = []
    let results4: boolean[] = []
    let loopAmount = 10000
    for(let i = 0; i < loopAmount; i++) {
        results0.push(randomPercentForTrue(0))
        results1.push(randomPercentForTrue(25))
        results2.push(randomPercentForTrue(50))
        results3.push(randomPercentForTrue(75))
        results4.push(randomPercentForTrue(100))
    }

    let resultTotals = Array(5).fill(0)
    for(let i = 0; i < loopAmount; i++) {
        resultTotals[0] += results0[i]
        resultTotals[1] += results1[i]
        resultTotals[2] += results2[i]
        resultTotals[3] += results3[i]
        resultTotals[4] += results4[i]
    }

    expect(resultTotals[0]).to.be.closeTo(0, 0)
    expect(resultTotals[1]).to.be.closeTo(loopAmount * 25 / 100, loopAmount * 25 / 100 / 20)
    expect(resultTotals[2]).to.be.closeTo(loopAmount * 50 / 100, loopAmount * 50 / 100 / 20)
    expect(resultTotals[3]).to.be.closeTo(loopAmount * 75 / 100, loopAmount * 75 / 100 / 20)
    expect(resultTotals[4]).to.be.closeTo(loopAmount, 0)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 2016-08-13
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多