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

时间:2015-07-06 16:21:37

标签: windows batch-file random

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

start 2.bat
@echo off
cls
echo %random%
pause

2.bat

@echo off
cls
echo %random%
pause

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

4 个答案:

答案 0 :(得分:1)

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

最好的办法是使用CryptGenRandom()功能,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx。您可以从Powershell中调用它

更新

显然,有一个用于加密的.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
....

答案 1 :(得分:0)

我不知道如何在批处理文件中获取随机数,但在powershell中很容易,

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

另一种选择是调用System.Random .net对象:

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

答案 2 :(得分:0)

好吧,您可以编写生成伪随机数的大量现有方法之一的批处理文件版本,或者查找可以在批处理文件中编程的批处理文件版本,而不会出现The Minimal Standard Random Number Generator之类的其他复杂情况,或者更简单的版本就像这些Two Fast Implementations一样,甚至可以修改其中一个以使其更简单!

@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

当然,我知道这种方法无法与大多数"标准"方法,但我认为它对于简单的批处理文件应用程序就足够了,比如游戏......

答案 3 :(得分:0)

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

相反,从批处理脚本调用PowerShell:

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