我有以下函数生成随机布尔值。 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%的时间为假。
答案 0 :(得分:11)
而不是>= 0.5
,您只需要< 0.7
:
var random_boolean = Math.random() < 0.7;
// 70% this will be true, 30% false
正如@plasmacel所评论的那样,Math.random()
返回0
和1
之间的值(包括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参数,结果将为:
因此,您可以将结果转到0.5,这意味着这不是此处生成的随机数。
虽然您的问题的答案将是
正如IonicăBizău所说。var random_boolean = Math.random()&gt; = 0.3;
但请记住,它是伪随机数!
答案 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)
})