Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和Java之间的随机行为差异:种子_C#_Java_Math - Fatal编程技术网

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

C#和Java之间的随机行为差异:种子,c#,java,math,C#,Java,Math,我有一个Random类,目的是在不同的上下文中生成随机序列:这是Java代码移植的结果。 在Java版本中,一切正常,因为Java.lang.Random类具有方法setSeed,该方法允许动态更改种子值 Random rnd = new Random(); ... rnd.nextInt(); ... rnd.setSeed(seedValue); 这将生成一致的结果,因为每次设置种子值时,结果都是随机的 不幸的是,在C#中,行为大不相同,因为随机类需要在构造时设置种子: Random rn

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

Random rnd = new Random();
...
rnd.nextInt();
...
rnd.setSeed(seedValue);
这将生成一致的结果,因为每次设置种子值时,结果都是随机的

不幸的是,在C#中,行为大不相同,因为随机类需要在构造时设置种子:

Random rnd = new Random(seedValue);
...
rnd.Next();
...
因此,每次我都必须使用给定的种子构建一个新的随机实例,在某些备用情况下,它会生成与前一次调用相同的值

这是一种在C#中动态设置随机实例种子的方法,而不会丢失全局实例的一致性吗


多谢各位

尝试将随机实例包装为伪代码:

class MyRandom {
   private Random random;

   public void setSeed(long seed) {
        random = new Random(seed);
        ...

   public long next() {
        return random.next();

尝试将随机实例包装为伪代码:

class MyRandom {
   private Random random;

   public void setSeed(long seed) {
        random = new Random(seed);
        ...

   public long next() {
        return random.next();

通常,我会为我的应用程序创建一个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使用大气噪声来产生随机性,显然用于彩票之类的活动。

通常,我会为我的应用程序创建一个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使用大气噪声来产生随机性,显然用于彩票之类的活动。

首先,我不希望在运行期间对
随机性
多次调用
设置种子。FreeCell这样做是为了通过写下使用的种子来“加载”游戏实例

如果更改种子,应该像重置随机实例一样,因此如果重新关联它,就不会有冲突
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
  }
}

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

首先,我不希望在运行期间对
随机
多次调用
设置种子
。FreeCell这样做是为了通过写下使用的种子来“加载”游戏实例

如果更改种子,应该像重置随机实例一样,因此如果重新关联它,就不会有冲突
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
  }
}

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

是否确实需要重新种子?它应该是“足够随机”的。不幸的是:random的实例是一个类的成员,该类在类的不同部分被调用,并且需要在类的所有实例中保持一致。是否确实需要重新播种?它应该是“足够随机”的。不幸的是:random的实例是一个类的成员,它在类的不同部分被调用,并且需要在类的所有实例中保持一致。这就是我目前正在做的(在移植版本中),并没有解决这个问题:正如我所说,我不应该重新初始化“random”的实例……这就是我目前正在做的(在移植版本中),并且没有解决这个问题:正如我所说的,我不应该重新初始化“random”的实例。。。