gpt4 book ai didi

c# - 为什么序列化类中的 Random 实例会重复生成同一组数字?

转载 作者:太空狗 更新时间:2023-10-29 20:28:42 26 4
gpt4 key购买 nike

所以我是一个 C# 菜鸟。我有一个快速的问题,但我无法在其他任何地方找到答案。

 [Serializable()]
public class Dictionary
{
private Random m_RandomGenerator = new Random();

public int GetNext()
{
return m_RandomGenerator.Next(100);
}
}

每次程序启动时都会加载Dictionary 实例,每次运行此代码都会返回完全相同的数字序列。我的意思是,每次运行可执行文件时。当然,它所播种的时间值应该不同(我假设是 DateTime.Now.Ticks?)。

几点:

  • 只有一个 Dictionary 实例,在启动时从先前导出的文件反序列化。
  • 如果我将 m_RandomGenerator 设置为静态,那么问题就解决了。

有人知道为什么吗?我确实仔细检查过我没有每次都创建新的 Dictionary 实例,所以这不是问题所在。


好吧,让我感到尴尬。事实证明,罪魁祸首是 [Serializable()] 属性。我使用的字典类是从先前导出的文件加载的,这显然是将种子加载回 Random()。将变量更改为静态意味着不再从先前序列化的实例加载种子值 - 隐藏了问题。

感谢所有提供建设性建议的人!

最佳答案

(CW,因为这对于评论来说太大了)

此测试只会在随机播种时重复。您应该发布调用 Dictionary 的代码,因为那里可能有些可疑(假设发布的代码是实际 代码)或者甚至更好发布您自己的重现该问题的测试。

[Test]
public void TestDictionary()
{
var dictionary = new Dictionary();

for(int i = 0; i < 10; i++)
{
Console.WriteLine(dictionary.GetNext());
}
}

[Serializable] // added after the fact
public class Dictionary
{
//private Random m_RandomGenerator = new Random(12);
private Random m_RandomGenerator = new Random();

public int GetNext()
{
return m_RandomGenerator.Next(100);
}
}

此测试确实重复了您的结果,但那是因为答案 here :

[Test]
public void TestDictionary2()
{
var alpha = new Dictionary();
var bravo = new Dictionary();

for(int i = 0; i < 10; i++)
{
Console.WriteLine("{0} - {1}", alpha.GetNext(), bravo.GetNext());
}
}

为了完整性,这里有一个序列化测试:

[Test]
public void SerializationPerhaps()
{
var charlie = new Dictionary();
Dictionary delta = null;

// Borrowed from MSDN: http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx

//Opens a file and serializes the object into it in binary format.
using (var stream = File.Open("data.xml", FileMode.Create))
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, charlie);
}


//Opens file "data.xml" and deserializes the object from it.
using (var stream = File.Open("data.xml", FileMode.Open))
{
var formatter = new BinaryFormatter();

delta = (Dictionary) formatter.Deserialize(stream);
stream.Close();
}

for(int i = 0; i < 10; i++)
{
Assert.AreEqual(charlie.GetNext(), delta.GetNext());
}
}

关于c# - 为什么序列化类中的 Random 实例会重复生成同一组数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7589388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com