Bash脚本 - 生成随机整数并写入文件

时间:2016-03-22 05:04:18

标签: bash random

我正在尝试生成大量的随机整数,并且我想将它们写入文本文件,然后将其用作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的初学者,所以我不确定我是否以正确的方式解决了这个问题,所以任何帮助都会非常感激!谢谢。

2 个答案:

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