web-dev-qa-db-ja.com

macOSでランダムな64ビット符号付き整数を生成するにはどうすればよいですか?

テスト用に64ビットの符号付き整数を生成する必要があります。

これどうやってするの?

#!/bin/sh
long=$(????)
3
Jin Kwon

/dev/urandomからキャプチャされた2つの32ビット整数を結合します。 odを使用して ステファンの答え ごとに単一の64ビット値をキャプチャすることは可能ですが、OS Xの少なくとも一部のバージョンでは、適切なエラーメッセージなしで失敗します。

#!/bin/sh
low32=$(od -An -td4 -N4 < /dev/urandom)
high32=$(od -An -td4 -N4 < /dev/urandom)
long=$(($low32 + ($high32 << 32) ))
3
user4556274

macOSにはPythonが付属しています。 random モジュールを使用します。

python -c 'import random; rng = random.SystemRandom(); print rng.randint(-2**63, 2**63-1)

MacOSには_/dev/urandom_があるので、次のことができるはずです。

_od -An -vtd8 -N8 < /dev/urandom
_

ただし、実際のmacOSシステムで試してみた人によると(コメントを参照)、そこでは機能しません。 macOSは認定されたUnixシステムであることが意図されているため、それはバグであることを意味します POSIXはそのコマンドの動作を明確に指定します 。 POSIXが指定しない(実装が定義する)唯一のことは、バイト順序です(これはすべてランダムなバイトであるため、ここでは気にしません)。

または、ここでksh/bash/zshの_$RANDOM_を使用することもできます。 macOSのshは最近bashに基づいていますが、bash/zsh(またはksh以外のmksh実装に切り替えたほうがよいでしょう。 _$RANDOM_はsh機能ではないため、32ビットを使用してください。別のシェルに切り替えることにした場合、macOSの将来のバージョンでは機能しない可能性があります。

_m=32768 # $RANDOM span
long=$((RANDOM+RANDOM*m+RANDOM*m*m+RANDOM*m*m*m+RANDOM*m*m*m*m))
_

または:

_long=$((RANDOM|(RANDOM<<15)|(RANDOM<<30)|(RANDOM<<45)|(RANDOM<<60)))
_

これは5 * 15 == 75ビットですが、シェルによって64ビットに切り捨てられます。

POSIXツールチェストでは、乱数を生成する方法はawkRand()を使用するため、次のことができます。

_awk 'BEGIN{srand(); printf "%.20g\n", Rand() * (2^64) - (2^63)}'
_

多くのawk実装(srand()の結果に基づいてtime(3)シードを実行する実装)では、2回実行すると同じ出力が得られることに注意してください。同じ秒で。

また、浮動小数点数の表現方法のため、64ビット数(2など)があると思います。63-1)出力されないこと。

2