如何产生猛砸范围内的随机数?
Answer 1:
使用$RANDOM
。 这与简单的shell算术组合往往是有用的。 例如,为了生成在1和10之间的随机数:
$ echo $((1 + RANDOM % 10))
3
实际的发电机是variables.c
,功能brand()
旧版本是一个简单的线性发电机。 4.0版本bash
使用一个发电机引文到1985年纸,这大概意味着它的伪随机数体面源。 我不会用它来模拟(当然不加密),但它可能足以满足其基本的脚本任务。
如果你正在做的事情,需要认真的随机数,你可以使用/dev/random
或/dev/urandom
,如果他们可供选择:
$ dd if=/dev/urandom count=4 bs=1 | od -t d
Answer 2:
请参阅$RANDOM
:
$RANDOM
是一个内部bash函数(不是常数),其取值范围为0返回一个伪随机整数-它不应该被用于产生加密密钥32767。
Answer 3:
从你的shell试试这个:
$ od -A n -t d -N 1 /dev/urandom
在这里, -td
指定的输出格式应当签字小数; -N 1
说来读取一个字节/dev/urandom
。
Answer 4:
您还可以使用SHUF(中的coreutils可用)。
shuf -i 1-100000 -n 1
Answer 5:
有$ RANDOM。 我不知道它究竟是如何工作的。 但是,它的工作原理。 为了测试,你可以这样做:
echo $RANDOM
Answer 6:
你还可以从awk的随机数
awk 'BEGIN {
# seed
srand()
for (i=1;i<=1000;i++){
print int(1 + rand() * 100)
}
}'
Answer 7:
随机数0至9之间的包容性。
echo $((RANDOM%10))
Answer 8:
如果您使用的是Linux系统,你可以得到一个随机数出的/ dev / random或 /开发/ urandom的。 要当心的/ dev /随机如果没有足够的可用随机数将阻止。 如果你需要速度超过随机性使用/ dev / urandom的。
这些“文件”将充满由操作系统产生的随机数。 这要看的/ dev /随机执行您的系统上,如果你得到真正的或伪随机数。 真正的随机数与设备驱动程序如鼠标,硬盘驱动器,网络收集的帮助形式产生的噪声。
您可以从文件获取随机编号DD
Answer 9:
我喜欢这一招:
echo ${RANDOM:0:1} # random number between 1 and 9
echo ${RANDOM:0:2} # random number between 1 and 99
...
Answer 10:
我已经采取了一些这些观点并提出如果需要大量的随机数应该迅速执行功能。
调用od
如果你需要大量的随机数是昂贵的。 相反,我把它称为一次,从/ dev / urandom的存储1024张的随机数。 当rand
被调用时,最后一个随机数返回和缩放。 它然后从缓存中删除。 当缓存为空,另一个1024张的随机数被读取。
例:
rand 10; echo $RET
返回RET 0和9(含)之间的随机数。
declare -ia RANDCACHE
declare -i RET RAWRAND=$(( (1<<32)-1 ))
function rand(){ # pick a random number from 0 to N-1. Max N is 2^32
local -i N=$1
[[ ${#RANDCACHE[*]} -eq 0 ]] && { RANDCACHE=( $(od -An -tu4 -N1024 /dev/urandom) ); } # refill cache
RET=$(( (RANDCACHE[-1]*N+1)/RAWRAND )) # pull last random number and scale
unset RANDCACHE[${#RANDCACHE[*]}-1] # pop read random number
};
# test by generating a lot of random numbers, then effectively place them in bins and count how many are in each bin.
declare -i c; declare -ia BIN
for (( c=0; c<100000; c++ )); do
rand 10
BIN[RET]+=1 # add to bin to check distribution
done
for (( c=0; c<10; c++ )); do
printf "%d %d\n" $c ${BIN[c]}
done
UPDATE:这并不适用于所有N.工作这么好,如果小N.注意到(在这种情况下)一个32位的随机数有0和9(10 * 9 9张之间的随机数足够的熵使用,这也浪费随机位= 1,000,000,000 <= 2 * 32),我们可以从各个随机32源数据中抽取多个随机数。
#!/bin/bash
declare -ia RCACHE
declare -i RET # return value
declare -i ENT=2 # keep track of unused entropy as 2^(entropy)
declare -i RND=RANDOM%ENT # a store for unused entropy - start with 1 bit
declare -i BYTES=4 # size of unsigned random bytes returned by od
declare -i BITS=8*BYTES # size of random data returned by od in bits
declare -i CACHE=16 # number of random numbers to cache
declare -i MAX=2**BITS # quantum of entropy per cached random number
declare -i c
function rand(){ # pick a random number from 0 to 2^BITS-1
[[ ${#RCACHE[*]} -eq 0 ]] && { RCACHE=( $(od -An -tu$BYTES -N$CACHE /dev/urandom) ); } # refill cache - could use /dev/random if CACHE is small
RET=${RCACHE[-1]} # pull last random number and scale
unset RCACHE[${#RCACHE[*]}-1] # pop read random number
};
function randBetween(){
local -i N=$1
[[ ENT -lt N ]] && { # not enough entropy to supply ln(N)/ln(2) bits
rand; RND=RET # get more random bits
ENT=MAX # reset entropy
}
RET=RND%N # random number to return
RND=RND/N # remaining randomness
ENT=ENT/N # remaining entropy
};
declare -ia BIN
for (( c=0; c<100000; c++ )); do
randBetween 10
BIN[RET]+=1
done
for c in ${BIN[*]}; do
echo $c
done
Answer 11:
从/ dev /随机或/ dev / urandom的字符特殊文件中读取是要走的路。
这些设备读取和旨在帮助应用软件选择加密安全密钥时,返回真正的随机数。 这样的随机数是从受各种随机事件贡献的熵池提取。 热网问题
更多热点问题
- 什么是“KAL”。 和“AS”这个题词代表什么?
- 我们是两个近邻谁伪造我们自己的力量,形成串联关系。 我们是谁?
- 不稳定的原子核为什么会形成?
- 什么是牛顿用极限的概念?
- 是什么在C / C常量数组和静态常量数组之间的区别++
- 为什么要使用蒸汽而不是仅仅热空气?
- 日期-d“上周一”,显示周一前
- 如何处理DM不断地窃取一切从沉睡字符?
- 最佳品种繁殖情报
- 有没有到位的应急计划,如果小男孩未能引爆?
- 这是什么报价小神是指什么?
- 看比赛,有一个谜
- 如何找到特定字体的TEX编码?
- 立方体的差异的进一步因式分解?
- 如何CoreiX像Corei5,I7得到相关的Haswell,Ivy Bridge的?
- 它是写不好,或者如果第一人称叙述含有比解说员知道的更多信息不好讲故事?
- 论文‘未来工作’部分-是可以接受的省略提到过的项目亲自参与?
- 密码哈希验证为什么要时间常数?
- 提高萨提-正知(situative智慧)
- 它是废话说乙- > [A - > B]?
- 我的完美霸主的邪恶计划......是这样吗?
- 它是投资时复制交易员是一个好主意?
- 异常传播:当捕获异常?
- 前1993年的漫画中,金刚狼的爪子变成橡胶?