使用“正常”(我的意思是“完整”)Linux发行版,它的工作正常:
sleep $(echo“$ [($ RANDOM%9)]”)
好吧,等待大约0-9秒左右
但在OpenWRT下[不使用bash,而不是“ash”]:
$ sleep $(echo“$ [($ RANDOM%9)]”)睡眠:无效数字'$ ['$
为什么:
$ echo“$ [($ RANDOM%9)]”$ [(%9)] $
那么有没有人有办法在OpenWRT下生成随机数,所以我可以把它放在“睡眠”中?
谢谢你
答案 0 :(得分:5)
您可以尝试这样的事情:
sleep `head /dev/urandom | tr -dc "0123456789" | head -c1`
哪个适用于我的WhiteRussian OpenWRT路由器。
我实际上不知道这是否总会返回一个数字,但是当它确实时,它总会返回0-9,并且只返回1位数(如果你做了第二个头,你可以使它达到99) C2)。
祝你好运!答案 1 :(得分:5)
你也可以使用awk
sleep $(awk 'BEGIN{srand();print int(rand()*9)}')
答案 2 :(得分:0)
对于某些情况,这可能不会产生足够多的答案。另一种方法是直接使用 /dev/urandom
(例如 https://www.2uo.de/myths-about-urandom/):
echo $(hexdump -n 4 -e '"%u"' </dev/urandom)
使用 awk
时,请注意 awk
使用一天中的时间作为种子 (https://linux.die.net/man/1/awk)。这可能与重置时间(例如没有电池支持的时钟)或跨队列同步(例如组重新启动)的情况相关。
srand([expr])
使用 expr 作为随机数生成器的新种子。如果未提供 expr,则使用一天中的时间。返回值是随机数生成器的前一个种子。
通过查看busybox (https://github.com/mirror/busybox/blob/master/editors/awk.c) 中的来源证实了这一点:
seed = op1 ? (unsigned)L_d : (unsigned)time(NULL);
至少对于某些版本的 Openwrt,似乎需要显式调用 srand()
以避免重复获得相同的答案:
# awk 'BEGIN{print rand(), rand()}'
0 0.345001
# awk 'BEGIN{print rand(), rand()}'
0 0.345001