如何计算“15%的时间”随机性?

时间:2010-12-14 00:44:59

标签: algorithm pseudocode

我正在寻找一种体面,优雅的计算这种简单逻辑的方法 现在我想不出一个,它在旋转我的脑袋。

我只需要15%的时间做一些动作。

我习惯于“50%的时间”,我只修改当前时间的毫秒,看看它是奇数还是偶数,但我不认为这很优雅。

我如何优雅地计算“15%的时间”?随机数发生器可能?
伪代码或任何语言都是受欢迎的。

希望这不是主观的,因为我正在寻找“最聪明”的简单方法。

感谢。

8 个答案:

答案 0 :(得分:3)

解决方案1(双倍)

  • 获得0到1之间的随机双倍(无论你使用什么语言,都必须有这样的功能)
  • 仅在小于0.15
  • 时执行操作

解决方案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()没有   必须是线性同余   随机数发生器。它的   完全允许它   更好的东西没有   这个问题。

它包含

的公式和伪代码
  • r = [0,1)= {r:0&lt; = r&lt; 1}真实的
  • x = [0,M)= {x:0&lt; = x&lt; M}真实
  • y = [0,M)= {y:0&lt; = y&lt; M}整数
  • z = [1,M] = {z:1&lt; = z&lt; = M}整数

答案 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的正结果。