生成随机布尔值70%True,30%false

时间:2017-05-30 13:10:20

标签: javascript random

我有以下函数生成随机布尔值。 choose_direction:function(){

 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%的时间为假。

3 个答案:

答案 0 :(得分:11)

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

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

正如@plasmacel所评论的那样,Math.random()返回01之间的值(包括0,但不是1[0, 1))因此我们做< 0.7

答案 1 :(得分:1)

让我们考虑一件事。 Math.random()为您提供一个伪随机数。

尝试此功能:

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

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

  • 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()&gt; = 0.3;

正如IonicăBizău所说。

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

答案 2 :(得分:0)

这是我用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
}

这些方法在各种用例中都经过了严格的测试。这是摩卡咖啡的测试用例:

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)
})