嵌套的随机生成器不是随机的

本文关键字:随机 嵌套 | 更新日期: 2024-10-22 11:19:04

我有以下代码。随机r有效,让我进入if大约10%。然而rr似乎不起作用。它总是返回0。我做错了什么?

我只想在10%的时间里在两个选项中随机选择。这是在一个asp.net应用程序中。单击按钮即可执行代码。

        Random r = new Random();
        Random rr = new Random();
        int randomnum = r.Next(0, 100);
        if (randomnum <= 10)
        {
            int randompick = rr.Next(0, 2);
            if (randompick == 0)
            {

嵌套的随机生成器不是随机的

如果你对外循环的随机性感到满意,可以考虑

int randompick = randomnum % 2;

而不是嵌套的Random对象。

两个随机选择都可以使用相同的Random对象,对吧?

如前所述,您应该只使用一个伪随机流并实例化它一次。我会按照以下思路构建我的解决方案:

class SomeWidget
{
    private static Random rng ;
    static SomeWidget()
    {
        rng = new Random() ;
        return ;
    }
    public SomeWidget()
    {
        return ;
    }
    public int DoOneThing90PercentOfTheTimeAndSomethingElseTheRestOfTheTime()
    {
        int rc ;
        int n = rng.Next() % 10 ; // get a number in the range 0 - 9 inclusive.
        if ( n != 0  ) // compare to whatever value you wish: 0, 1, 2, 3, 4, 5, 6, 8 or 9. It makes no nevermind
        {
             rc = TheNinetyPercentSolution() ;
        }
        else
        {
            rc = TheTenPercentSolution() ;
        }
        return rc ;
    }
    private int TheTenPercentSolution()
    {
        int rc ;
        int n = rng.Next() % 2 ;
        if ( n == 0 )
        {
            rc = DoOneThing() ;
        }
        else
        {
            rc = DoAnotherThing() ;
        }
        return rc ;
    }
    private int DoOneThing()
    {
        return 1;
    }
    private int DoAnotherThing()
    {
        return 2 ;
    }
    private int TheNinetyPercentSolution()
    {
        return 3 ;
    }
}