【问题标题】:Does linqpad reuse the random seed between querieslinqpad 是否在查询之间重用随机种子
【发布时间】:2020-03-30 14:21:26
【问题描述】:

对于此代码:

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 中得到以下结果:

物业1 167577867

物业2 2076433106

静态场1 1758463813

静态场2 1758463813

实例字段1 1875178546

实例字段2 1875178546

静态字段 1 和 2,实例字段 1 和 2 在同一查询中运行时显示相同的随机数。这与预期的一样,但是即使我重新运行查询,实例字段 1 和 2 将继续显示与之前运行相同的随机数。所以我怀疑种子是固定的,但无法确认。

第二次查询运行:

物业1 1860313679

物业2 1472007479

静态场1 1758463813

静态场2 1758463813

实例字段1 1370753000

实例字段2 1370753000

【问题讨论】:

  • linqpad 是否在查询之间重用随机种子? 不...更改某些内容并检查...它只是重用已编译的程序集...它会一直加载 em 直到重新编译需要,所以静态字段是相同的
  • 似乎确实如此。谢谢!

标签: c# random linqpad


【解决方案1】:

没有。 LinqPad 为什么要对随机数进行特殊处理,使其与其他应用程序不兼容?

它将每个查询编译成一个单独的程序集,并且只初始化一次静态变量。为了卸载程序集,它需要销毁包含程序集的 AppDomain。

因此,它也有可能为每个查询创建一个 AppDomain 并将该 AppDomain 重新用于后续运行。但是通过检查AppDomain.CurrentDomain,情况似乎并非如此。所以我们有 1 个 AppDomain 和多个程序集。

您可以通过在代码中添加Console.WriteLine("Test"); 来确认这一点,以便它需要重新编译。你会得到一个新号码。

【讨论】:

  • 或按 Ctrl-Shift-F5。
  • 另外,您可以将Util.NewProcess = true 添加到查询中,以强制它在每次执行时创建一个新进程。
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多