Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何批量获得真正的随机数?_Windows_Batch File_Random - Fatal编程技术网

Windows 如何批量获得真正的随机数?

Windows 如何批量获得真正的随机数?,windows,batch-file,random,Windows,Batch File,Random,每个人都会在某个时刻使用随机数。因此,我需要从命令提示符生成一些真正的随机数(不是伪随机数*),我还需要一个系统,该系统在代码行中生成大小为:set random=%random%%%2+1的字母。我只是想抓住一只不存在的蝴蝶吗*伪随机是依赖于外部信息(如时间)的随机,batch的随机生成器是基于时间的伪随机,要测试这个,请打开2个新记事本.bat并将此文件命名为1.bat 1.蝙蝠 2.bat 发生什么事了?!?这是伪随机的,只要打开批处理文件之间没有延迟,批处理文件的编号就会相同 你基本上是

每个人都会在某个时刻使用随机数。因此,我需要从命令提示符生成一些真正的随机数(不是伪随机数*),我还需要一个系统,该系统在代码行中生成大小为:
set random=%random%%%2+1
的字母。我只是想抓住一只不存在的蝴蝶吗*伪随机是依赖于外部信息(如时间)的随机,batch的随机生成器是基于时间的伪随机,要测试这个,请打开2个新记事本.bat并将此文件命名为1.bat
1.蝙蝠

2.bat


发生什么事了?!?这是伪随机的,只要打开批处理文件之间没有延迟,批处理文件的编号就会相同

你基本上是在要求熵池,而你的平台是Windows,对吗

最好使用
CryptGenRandom()
函数,请参阅。你可以从Powershell中调用它

[System.Security.Cryptography.RNGCryptoServiceProvider] $rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider

$rndnum = New-Object byte[] 4
# Generate random sequence of bytes 
$rng.GetBytes($rndnum)

# rndnum is filled with random bits
....
更新

显然,加密有一个.NET包装器,所以您可以从Powershell使用它

[System.Security.Cryptography.RNGCryptoServiceProvider] $rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider

$rndnum = New-Object byte[] 4
# Generate random sequence of bytes 
$rng.GetBytes($rndnum)

# rndnum is filled with random bits
....

在powershell上这很容易

您可以单独使用cmdlet
Get Random
,或指定范围,如
1..100 | Get Random

另一个选项是直接调用
系统.Random
对象:

$Random = New-Object System.Random
$Random.Next()

好吧,你可以编写一个生成伪随机数的现有方法之一的批处理文件版本,或者寻找一个可以在批处理文件中编程而没有进一步复杂化的方法,或者一个更简单的版本,甚至修改其中一个使其更简单

@echo off
setlocal EnableDelayedExpansion

rem Pseudo random number generator based on "The Minimal Standard"
rem http://www.firstpr.com.au/dsp/rand31/p87-carta.pdf
rem Antonio Perez Ayala aka Aacini

rem Initialize values
set /A a=16807, s=40

rem APA Modification: use current centiseconds for initial value
for /F "tokens=2 delims=." %%a in ("%time%") do if "%%a" neq "00" set /A s=1%%a %% 100


rem Example of use: generate and show 20 random numbers
for /L %%i in (1,1,20) do (
   call :RandomGen
   echo !rand!
)
goto :EOF



:RandomGen

rem Multiply the two factors
set /A s*=a

rem If the result overflow 31 bits
if %s% lss 0 (
   rem Get result MOD (2^31-1)
   set /A s+=0x80000000
)

rem APA modification: return just the low 15 bits of result (number between 0..32767)
set /A "rand=s & 0x7FFF"

exit /B

当然,我知道这种方法无法与大多数“标准”方法相比,但我认为它对于简单的批处理文件应用程序(如游戏)来说已经足够了。

问题确实在于
%RANDOM%
只是伪随机的,并且取决于何时调用它;如果两个脚本同时使用它(更多更少),它将具有相同的值

而是从批处理脚本调用PowerShell:

    @for /f "tokens=*" %%i in ('powershell -Command "(1..100 | Get-Random)"') do @(
        set "trueRandomInteger_between_1_and_100=%%i"
    )

这是一个批处理文件当然是WINDOWS!请指定它的作用,而不仅仅是提供一个链接…@enderscy您可能需要添加平台标记。关于这个函数的WRT,它确实填充了可以考虑真正随机位的缓冲区。windows平台上非伪随机生成器的最佳选择。我不知道如何从批处理调用它,但从Powershell调用它可能更好option@SeverinPappadeux-批处理文件标记说明清楚地表明它专门用于DOS、OS/2和Windows。而且,你所发布的链接只提到函数在C++中工作,所以如果你有一种在PuthS壳中运行它的方法,请把它添加到你的答案中。虽然批处理文件在多个系统上使用,但熵/加密随机数生成器是非常特定于平台的。因此,除了
batch
标记之外,您还必须指定您的平台。请参阅更新wrt powershell我们可以只使用基本批处理,而不是.net或powershell吗?可能是系统的副本。Random是常见的伪随机数生成器,而不是askedRandom在批处理中是%Random%,技术上是伪随机的。。。(它使用厘米秒)好吧,这个方法“技术上”不是伪随机的;它实际上是伪随机的(如我的回答中的两行所示)。表明:仅基于确定性计算的“随机数生成器”不能被视为最纯粹意义上的“真实”随机数生成器。。。换句话说:没有办法通过计算机程序生成真正的随机数,但这种方法以一种非常简单的方式解决了在两个或多个同时批处理文件中生成相同数字序列的问题。。。
    @for /f "tokens=*" %%i in ('powershell -Command "(1..100 | Get-Random)"') do @(
        set "trueRandomInteger_between_1_and_100=%%i"
    )