我正在寻找一种体面,优雅的计算这种简单逻辑的方法 现在我想不出一个,它在旋转我的脑袋。
我只需要15%的时间做一些动作。
我习惯于“50%的时间”,我只修改当前时间的毫秒,看看它是奇数还是偶数,但我不认为这很优雅。
我如何优雅地计算“15%的时间”?随机数发生器可能?
伪代码或任何语言都是受欢迎的。
希望这不是主观的,因为我正在寻找“最聪明”的简单方法。
感谢。
答案 0 :(得分:3)
解决方案1(双倍)
解决方案2(int)
你也可以通过创建一个随机int来实现这一点,看看它是否可以分为6或7. UPDATE - >这不是最佳的。
答案 1 :(得分:2)
您可以生成0到99之间的随机数,并检查它是否小于15:
if (rnd.Next(100) < 15) ...
您还可以减少数字,因为15/100与3/20相同:
if (rnd.Next(20) < 3) ...
答案 2 :(得分:1)
只需使用PRNG。像往常一样,这是一种绩效与准确性的权衡。我认为直接制作你自己的做法是浪费时间(双关语)。你可能会得到偏置效应甚至比磨机线性同余发生器更差。
在Java中,我会使用nextInt:
myRNG.nextInt(100) < 15
或(大部分)等效地:
myRNG.nextInt(20) < 3
有办法在其他语言中获得随机整数(实际上有多种方式,具体取决于它的准确程度)。
答案 3 :(得分:1)
随机数生成器会给你最好的随机性。生成0到1之间的随机,测试&lt; 0.15。
使用这样的时间不是真正的随机,因为它受处理时间的影响。如果任务运行时间不到1毫秒,则下一个随机选择将是相同的。
也就是说,如果您确实想要使用基于毫秒的方法,请执行milliseconds % 20 < 3
。
答案 4 :(得分:0)
使用模运算,您可以轻松地每隔Xth运行一次
(6 will give you ruthly 15%
if(microtime()%6 ===)这样做
其他事情:
if(rand(0,1) >= 0.15) do it
答案 5 :(得分:0)
boolean array[100] = {true:first 15, false:rest};
shuffle(array);
while(array.size > 0)
{
// pop first element of the array.
if(element == true)
do_action();
else
do_something_else();
}
// redo the whole thing again when no elements are left.
答案 6 :(得分:0)
这个引用来自一个很棒的article,关于如何使用随机数生成器:
注意:请勿使用
y = rand() % M;
因为这集中在低位 RAND()。对于线性同余随机 数字生成器,经常rand() 是,较低的字节要少得多 随机比较高的字节。事实上 最低位循环在0和1之间。 因此rand()可以在even和之间循环 奇怪的(尝试一下)。注意rand()没有 必须是线性同余 随机数发生器。它的 完全允许它 更好的东西没有 这个问题。
它包含
的公式和伪代码答案 7 :(得分:0)
这是一种结合随机性和保证的方法,最终可以在可预测的范围内获得积极的结果:
有一个目标(在你的情况下是15),一个计数器(初始化为0)和一个标志(初始化为假)。
Accept a request.
If the counter is 15, reset the counter and the flag.
If the flag is true, return negative outcome.
Get a random true or false based on one of the methods described in other answers, but use a probability of 1/(15-counter).
Increment counter
If result is true, set flag to true and return a positive outcome. Else return a negative outcome.
Accept next request
这意味着第一个请求的回报率为1/15的概率为正,但是在第15个请求中,如果没有返回正结果,则可能是1/1的正结果。