2012-08-03 68 views
2

我有以下代码。随机r的作品,并得到我约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) 
      { 
+7

难道你只是使用相同的随机选择对象? – 2012-08-03 23:21:35

+1

** NB ** _“默认种子值是从系统时钟派生的,并具有有限分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,并且,因此,将产生相同的随机数集合。“_ http://msdn.microsoft.com/en-us/library/h343ddh9.aspx – 2012-08-03 23:22:32

+1

”随机“类的良好经验法则:不要重新构造每次你需要一个号码时,RNG。创建一个'Random',将其存储在一个具有类作用域的变量中,只要需要一个数字,就调用'r.Next(X,Y)'。 – 2012-08-03 23:24:06

回答

4

如果你很高兴与外循环的随机性,考虑

int randompick = randomnum % 2; 

代替嵌套的随机对象。

1

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

+0

不好意思Sam现在我看着它Babak的答案有点优雅。但我非常感谢你的回答。 – Tigran 2012-08-03 23:33:53

+0

谢谢@Tigran! – 2012-08-03 23:34:48

0

如上所述,您应该只使用一个伪随机流并仅实例化一次。我会沿着这些线构建我的解决方案:

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

}