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"); 放入代码中来确认这一点,以便它需要重新编译。您将获得一个新号码。