使用相同的种子(C#)重置随机数生成器

使用相同的种子(C#)重置随机数生成器,c#,random,random-seed,C#,Random,Random Seed,我的情况如下: 我正在用C#做一个游戏,每次你开始一个新关卡时,它都会随机化屏幕上所有物体的位置。为了做到这一点,我刚刚宣布 random r = new Random(); 然后我决定,即使我想随机化每当一个新的水平开始,我希望每个水平是相同的每一次。。换言之,每一次你开始游戏时,第一级的位置都是一样的,其他所有级别的位置都是一样的 为此,我向生成器添加了一个种子: random r = new Random(mySeed); 这非常有效-当我退出游戏并重新开始时,1级中的随机位置每次都是

我的情况如下:

我正在用C#做一个游戏,每次你开始一个新关卡时,它都会随机化屏幕上所有物体的位置。为了做到这一点,我刚刚宣布

random r = new Random();
然后我决定,即使我想随机化每当一个新的水平开始,我希望每个水平是相同的每一次。。换言之,每一次你开始游戏时,第一级的位置都是一样的,其他所有级别的位置都是一样的

为此,我向生成器添加了一个种子:

random r = new Random(mySeed);
这非常有效-当我退出游戏并重新开始时,1级中的随机位置每次都是相同的

然而,问题是: 我知道当你给随机对象一个种子时,它会用这个种子来生成它的数字列表,这就是为什么无论我重新打开程序多少次,我所有的r.Next()都是一样的。但是,似乎我必须完全重新启动整个程序,以便重置它并再次回到列表中的第一项

换句话说,如果玩家在1级死亡,你回到主菜单。。但是当它调用r.Next()时,它当然不会给出正确的1级位置

我试图通过在你死后重新构造对象来解决这个问题,例如:

//other death code in here
r = new Random(mySeed);
//back to main menu
但这似乎没有什么区别——它仍将继续从以前的顺序继续

那么,有人知道我如何在不重新启动整个程序的情况下返回到随机列表的开头吗


谢谢

好吧,看来皮埃尔·卢克诺是对的

我确实通过重新构建我的随机对象来修复它——我以前只是在错误的地方做的

以前,我在做 r=新随机(mySeed) 死后,由于某种原因,这不起作用。。但是我移动了当你点击主菜单上的新游戏时调用的代码,现在它可以工作了

我之前甚至添加了一个断点,代码肯定会被执行。。然后我做了整个,一步一步地通过每一行,输入调试。。。 结果是,从那时到下一次我再次开始游戏的时候,我在做一个r.next()的时候,中间有一个点,所以把整个序列搞乱了


所以,是的,重新构造对象非常好,下次我会更加小心,我到底在哪里做;)

您确定要替换主程序中使用的
Random
实例(而不仅仅是方法的局部变量)吗?如果希望每次生成的每个级别都相同,那么它不是真正的随机,对吗?为什么不预先计算所有级别对象并存储它们呢?重建它是有效的,下面是。所以你的代码在其他地方有问题。@Douglas-是的,我在一个类中只有一个公共静态的随机实例,它被所有其他方法使用。这并不能回答你的问题,但有没有想过将r.Next()保留在静态列表中?然后,在死亡时,玩家使用该列表直到结束,然后再次开始使用r.Next()?