-3

使用“正常”(我的意思是“完整”)Linux发行版,它工作得很好:

sleep $(echo "$[ ($RANDOM % 9 ) ]")

好的,它等待大约 0-9 秒

,但在 OpenWRT [不使用 bash,而是使用 "ash"]:

$ sleep $(echo "$[ ($RANDOM % 9 ) ]") sleep: invalid number '$[' $

以及为什么:

$ echo "$[ ($RANDOM % 9) ]" $[ ( % 9 ) ] $

那么有没有人有办法在OpenWRT下生成随机数,所以我可以把它放在“睡眠”中?

谢谢

4

3 回答 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 回答