如何在OpenWRT下生成随机数?

时间:2011-01-13 10:10:30

标签: openwrt

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

sleep $(echo“$ [($ RANDOM%9)]”)

好吧,等待大约0-9秒左右
但在OpenWRT下[不使用bash,而不是“ash”]:

$ sleep $(echo“$ [($ RANDOM%9)]”)睡眠:无效数字'$ ['$

为什么:

$ echo“$ [($ RANDOM%9)]”$ [(%9)] $

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

3 个答案:

答案 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