linqpad是否重用查询之间的随机种子
Does linqpad reuse the random seed between queries
对于此代码:
void Main()
{
var testRandom = new TestRandom();
testRandom.RandGen.Dump("Property1");
testRandom.RandGen.Dump("Property2");
TestRandom.rngStatic.Dump("Static field1");
TestRandom.rngStatic.Dump("Static field2");
testRandom.rngInstance.Dump("Instance field1");
testRandom.rngInstance.Dump("Instance field2");
}
// Define other methods, classes and namespaces here
class TestRandom
{
private static Random _rnd = new System.Random();
public static int rngStatic = _rnd.Next();
public int rngInstance = _rnd.Next();
public int RandGen => _rnd.Next();
}
我在 LinqPad 中得到以下结果:
Property1 167577867
Property2 2076433106
Static field1 1758463813
Static field2 1758463813
Instance field1 1875178546
Instance field2 1875178546
静态字段1和2,实例字段1和2在同一个查询中运行时显示相同的随机数。这符合预期,但是即使我重新 运行 查询,实例字段 1 和 2 仍将显示与之前 运行 中相同的随机数。所以我怀疑种子是固定的,但无法确认。
第二次查询 运行:
Property1 1860313679
Property2 1472007479
Static field1 1758463813
Static field2 1758463813
Instance field1 1370753000
Instance field2 1370753000
没有。为什么 LinqPad 应该对随机数进行特殊处理,使其与其他应用程序不兼容?
它将每个查询编译成一个单独的程序集,并且只初始化一次静态变量。为了卸载程序集,需要销毁包含该程序集的 AppDomain。
因此,它也可能为每个查询创建一个 AppDomain 并在后续运行中重新使用该 AppDomain。但是检查 AppDomain.CurrentDomain
,情况似乎并非如此。所以我们有 1 个 AppDomain 和多个程序集。
您可以通过将 Console.WriteLine("Test");
放入代码中来确认这一点,以便它需要重新编译。您将获得一个新号码。
对于此代码:
void Main()
{
var testRandom = new TestRandom();
testRandom.RandGen.Dump("Property1");
testRandom.RandGen.Dump("Property2");
TestRandom.rngStatic.Dump("Static field1");
TestRandom.rngStatic.Dump("Static field2");
testRandom.rngInstance.Dump("Instance field1");
testRandom.rngInstance.Dump("Instance field2");
}
// Define other methods, classes and namespaces here
class TestRandom
{
private static Random _rnd = new System.Random();
public static int rngStatic = _rnd.Next();
public int rngInstance = _rnd.Next();
public int RandGen => _rnd.Next();
}
我在 LinqPad 中得到以下结果:
Property1 167577867
Property2 2076433106
Static field1 1758463813
Static field2 1758463813
Instance field1 1875178546
Instance field2 1875178546
静态字段1和2,实例字段1和2在同一个查询中运行时显示相同的随机数。这符合预期,但是即使我重新 运行 查询,实例字段 1 和 2 仍将显示与之前 运行 中相同的随机数。所以我怀疑种子是固定的,但无法确认。
第二次查询 运行:
Property1 1860313679
Property2 1472007479
Static field1 1758463813
Static field2 1758463813
Instance field1 1370753000
Instance field2 1370753000
没有。为什么 LinqPad 应该对随机数进行特殊处理,使其与其他应用程序不兼容?
它将每个查询编译成一个单独的程序集,并且只初始化一次静态变量。为了卸载程序集,需要销毁包含该程序集的 AppDomain。
因此,它也可能为每个查询创建一个 AppDomain 并在后续运行中重新使用该 AppDomain。但是检查 AppDomain.CurrentDomain
,情况似乎并非如此。所以我们有 1 个 AppDomain 和多个程序集。
您可以通过将 Console.WriteLine("Test");
放入代码中来确认这一点,以便它需要重新编译。您将获得一个新号码。