2015-12-17 21 views
2

Powershell Get-Random cmdlet的文档表明该种子是系统滴答计数,但如果执行以下测试,则$rand1的值不会被复制到输出中for()循环等似乎独立于TickCount。这是为什么?什么是Powershell Get-Random cmdlet的默认种子

# generate a random int32 - should automatically use the tickcount as seed? 
$tick1 = ([Environment]::TickCount) 
$rand1 = Get-Random 
Write-Host $rand1 
$tick2 = ([Environment]::TickCount) 

# generate seeded randoms with all possible values used to generate $rand1 
for ($i = $tick1; $i -le $tick2; $i++) { 
    $rand2 = Get-Random -SetSeed $i 
    Write-Host $rand2 
} 
+0

2件事情:在将当前滴答计数分配给$ tick1和解析+执行Get-Random之间的时间内,'TickCount'值无疑增加了。此外,帮助文件说*它使用*系统时钟来计算种子,而不是种子*是系统时钟的值,必然 –

+0

关于第一点:这就是为什么我收集之前和之后的滴答计数($ tick1和$ tick2),然后遍历生成$ rand1时Get-Random可用的所有可能值,所以我认为这是可以解释的吗? 奇怪的是,Get-Random仅仅是.net Random函数的一个包装。我已经测试过这个功能,它确实按预期工作 - 它确实使用了滴答计数。 – user5690322

+0

你是对的 - 在PowerShell cmdlet中必须做些额外的事情,但在使用powershell反射器检查它时,我无法看到它除了调用和传递.net生成器之外什么都做。这有点模糊。 – user5690322

回答

2

Get-Random是,当你使用它不一定直接播种(当然不是每次使用它的时间),它可以是在进程启动时,或者当您第一次使用它的会话。通常PRNG不应播种一次以上。

另外,正如Mathias在评论中所述,它不一定直接使用Environment.TickCount的值。您可以使用ILSpy查看相关程序集的来源以了解它的完成情况。我不会为你做这件事,因为我是开源PowerShell实现的贡献者。