使用“正常”(我的意思是“完整”)Linux发行版,它工作得很好:
sleep $(echo "$[ ($RANDOM % 9 ) ]")
好的,它等待大约 0-9 秒
,但在 OpenWRT [不使用 bash,而是使用 "ash"]:
$ sleep $(echo "$[ ($RANDOM % 9 ) ]") sleep: invalid number '$[' $
以及为什么:
$ echo "$[ ($RANDOM % 9) ]" $[ ( % 9 ) ] $
那么有没有人有办法在OpenWRT下生成随机数,所以我可以把它放在“睡眠”中?
谢谢
问问题
3372 次
3 回答
7
你可以尝试这样的事情:
sleep `head /dev/urandom | tr -dc "0123456789" | head -c1`
这适用于我的 WhiteRussian OpenWRT 路由器。
我实际上不知道这是否总是会返回一个数字,但是当它返回时,它总是会返回 0-9,并且只有 1 位数字(如果你制作了第二个头 -c2,你可以让它上升到 99)。
祝你好运!
于 2011-01-13T10:36:15.273 回答
7
你也可以使用 awk
sleep $(awk 'BEGIN{srand();print int(rand()*9)}')
于 2012-03-30T19:31:49.917 回答
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
于 2021-05-10T15:52:43.210 回答