我正在尝试生成大量的随机整数,并且我想将它们写入文本文件,然后将其用作C程序的标准输入,然后重新执行该过程,但需要更多的随机整数。
这就是我目前所拥有的:
declare -a numbers=(100 1000 10000 20000 30000 40000 50000);
for number in ${numbers[*]}
do
for z in $(seq 1 $number)
do
shuf -i 0-99 -n 1 >> tests.txt
echo '\n' >> tests.txt
done
ksm.exe 50 < tests.txt
done
exit 0
我目前有几个问题。首先,每个随机值不会被放置在文本文件中的新行上,这对我的程序是必需的。其次,生成随机数的过程非常缓慢,有没有更快的方法呢?我是Bash的初学者,所以我不确定我是否以正确的方式解决了这个问题,所以任何帮助都会非常感激!谢谢。
答案 0 :(得分:1)
每个 for 循环迭代启动一个 shuf 进程:运行151100个shuf进程。
将取代替换为包含 printf 和 \ n 的新行的AWK脚本:
AWK脚本:
#!/usr/bin/awk -f
BEGIN {
srand();
i=1;
while (i++<=ENVIRON["MAXNUMBER"]) {
printf("%d\n",int(rand()*99 + 0.5));
}
exit;
}
使其可执行:
chmod +x script.awk
请注意,MAXNUMBER shell变量用于将参数传递给AWK脚本。
更改原始shell脚本, awk 将运行7次:
declare -a numbers=(100 1000 10000 20000 30000 40000 50000);
for number in ${numbers[*]}
do
MAXNUMBER=$number ./script.awk >> tests.txt
ksm.exe 50 < tests.txt
done
exit 0
测试持续时间为237毫秒,只有一个简单的回声:
time ./script.sh
ksm.exe 50 < tests.txt
ksm.exe 50 < tests.txt
ksm.exe 50 < tests.txt
ksm.exe 50 < tests.txt
ksm.exe 50 < tests.txt
ksm.exe 50 < tests.txt
ksm.exe 50 < tests.txt
real 0m0.237s
user 0m0.213s
sys 0m0.026s
wc -l tests.txt
151100 tests.txt
答案 1 :(得分:0)
如果你真的想坚持使用bash
,那么有一个名为RANDOM
的内部函数,它返回一个0到32767之间的int范围。
~ % echo $RANDOM
1287
~ % echo $RANDOM
8161
~ % echo $RANDOM
28791
请查看此处的文档:http://www.tldp.org/LDP/abs/html/randomvar.html
====更新实际解决方案====
所以在循环中,你可以做printf "$RANDOM/n" >> tests.txt
,如下所示:
#!/bin/bash
declare -a numbers=(100 1000 10000 20000 30000 40000 50000)
for number in ${numbers[*]}
do
for ((i=0;i<$number;i++))
do
# generates number from 0-99
printf "$((RANDOM*99/32767))\n" >> tests.txt
done
ksm.exe 50 < tests.txt
done
====更新以获得更好的性能====
谢谢@Jay
#!/bin/bash
declare -a numbers=(100 1000 10000 20000 30000 40000 50000)
function get_randoms {
for ((i=0;i<$1;i++))
do
# generates number from 0-99
printf "$((RANDOM*99/32767))\n"
done
}
for number in ${numbers[*]}
do
printf "$(get_randoms $number)" >> tests.txt
ksm.exe 50 < tests.txt
done
以前的笔记本电脑上需要大约14秒,更新后的需要大约3秒。