C#和Java之间的随机行为差异:种子
我有一个Random类,目的是在不同的上下文中生成随机序列:这是Java代码移植的结果。 在Java版本中,一切正常,因为Java.lang.Random类具有方法setSeed,该方法允许动态更改种子值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 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”的实例。。。