代码之家  ›  专栏  ›  技术社区  ›  Antonello

C#和Java之间的随机行为差异:种子

  •  1
  • Antonello  · 技术社区  · 17 年前

    我有一个Random类,目的是在不同的上下文中生成随机序列:这是Java代码移植的结果。 在Java版本中,一切正常,因为Java.lang.Random类具有方法setSeed,该方法允许动态更改种子值。

    Random rnd = new Random();
    ...
    rnd.nextInt();
    ...
    rnd.setSeed(seedValue);
    

    这将生成一致的结果,因为每次设置种子值时,结果都是随机的。

    Random rnd = new Random(seedValue);
    ...
    rnd.Next();
    ...
    

    因此,每次我都必须使用给定的种子构建一个新的随机实例,在某些备用情况下,它会生成与前一次调用相同的值。

    非常感谢你!

    3 回复  |  直到 17 年前
        1
  •  1
  •   sipsorcery    17 年前

    通常,我会为我的应用程序创建一个Random的实例,在设置了实例的种子之后,可以依赖于对Next的每次调用,并给我一个新的随机数。诀窍是确保种子尽可能随机。在C#app中使用Random就是一个很好的例子,说明单身是一个很好的选择。

    有很多种方法可以在你的种子中获得不同的随机性,有一些很好的问题可以解决这个问题。

    下面的例子就是我使用的方法。

    m_randomURL = "https://www.random.org/cgi-bin/randnum?num=1&min=1&max=1000000000";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(m_randomURL);
    StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
    Random rand = new Random(Convert.ToInt32(stIn.ReadToEnd()));
    

    random.org使用大气噪声产生随机性,显然用于彩票等。

        2
  •  0
  •   dfa    17 年前

    class MyRandom {
       private Random random;
    
       public void setSeed(long seed) {
            random = new Random(seed);
            ...
    
       public long next() {
            return random.next();
    
        3
  •  0
  •   Marcel Jackwerth    17 年前

    setSeed Random 在运行时。 这样您就可以通过写下使用的种子来“加载”游戏实例。

    重置 随机实例,因此,如果重新关联它,应该不会有冲突。 只是底层算法的包装器。

    如果希望每次都收到不同的结果(即使使用setSeed),可以尝试以下方法:

    class MyRandom {
      private Random random = new Random(DateTime.Now.Ticks);
    
      public void setSeed(long seed) {
        random = new Random(seed * this.random.next());
        ...
    
      public long next() {
        return random.next();
    }
    
    class MyClass {
      private MyRandom random = new MyRandom();
      public void Test() {
        random.setSeed(seedValue);
        int x = random.next();
        random.setSeed(seedValue);
        int y = random.next();
        // x,y will be different in most of the cases now
      }
    }
    

    这将改变随机生成器的种子应该如何工作的前置/后置条件,但可能对您有效。