我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
我需要从一个shell脚本生成一个2000-65000之间的随机端口号。问题是$RANDOM是一个15位的数字,所以我被卡住了!
如果没有大小限制,PORT=$(($RANDOM%63000+2001))将很好地工作。
有没有人有一个例子,我可以这样做,也许从/dev/urandom提取一些东西,并得到它在一个范围内?
当前回答
你可以这样做
cat /dev/urandom|od -N2 -An -i|awk -v f=2000 -v r=65000 '{printf "%i\n", f + r * $1 / 65536}'
如果需要更多详细信息,请参阅Shell脚本随机数生成器。
其他回答
这是一个用Python写的
randport=$(python -S -c "import random; print random.randrange(2000,63000)")
还有一个是awk
awk 'BEGIN{srand();print int(rand()*(63000-2000))+2000 }'
在Mac OS X和FreeBSD上,你也可以使用jot:
jot -r 1 2000 65000
PORT=$(($RANDOM%63000+2001))接近你想要的,我认为。
PORT=$(($RANDOM$RANDOM$RANDOM%63000+2001))绕过了困扰您的大小限制。由于bash不区分数字变量和字符串变量,因此这工作得非常好。“数字”$RANDOM可以像字符串一样连接,然后在计算中用作数字。神奇的!
根据bash手册页,$RANDOM分布在0到32767之间;也就是说,它是一个无符号的15位值。假设$RANDOM是均匀分布的,可以创建一个均匀分布的30位无符号整数,如下所示:
$(((RANDOM<<15)|RANDOM))
因为你的范围不是2的幂,一个简单的模运算几乎只能给你一个均匀的分布,但如果输入范围是30位,输出范围小于16位,就像你的例子一样,这应该足够接近了:
PORT=$(( ((RANDOM<<15)|RANDOM) % 63001 + 2000 ))
这对我来说很管用:
export CUDA_VISIBLE_DEVICES=$((( RANDOM % 8 )))
如果你想让它从1开始而不是0,你可以加1。