本文介绍使用shell实现将一个整数m随机分解为n个数。
要求:
- 将一个整数m分解为n个随机数,n个随机数之和要等于m
- 指定随机数的最小值
分析:
这与leetcode上的两道题类似:
下面来介绍一种思路:
- 随机抽取
n-1
个区间为(0, m)
的数,得到数组a
- 将
0
和m
加入数组a
中 - 对数组
a
进行升序排序 - 按顺序计算数组
a
中相邻元素的差值:后一个元素减去前一个元素。差值组成的数组就是我们要的结果。
shell脚本SplitInteger.sh:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
SplitInteger()
{
let SIZE_BYTES=$SIZE_BYTES-$NUMBER*$minNum
declare -a num_list
num_list[0]=0
num_list[1]=$SIZE_BYTES
let num=$NUMBER
for i in $(seq 2 $num); do
random_rate=`echo "scale=4 ; ${RANDOM}/32767" | bc -l` # 生成0-1的随机数
# let random_bytes=$(( SIZE_BYTES*random_rate ))
random_bytes=`echo "$SIZE_BYTES*$random_rate" | bc` # 字符类型转换为数字类型进行运算
# echo "$random_bytes"
num_list[$i]=`echo $random_bytes | xargs printf "%.*f\n" 0` # 对结果进行四舍五入计算
done
# echo "Array in unsorted order :"
# echo ${num_list[*]}
num_length=${#num_list[*]}
BubbleSort # 排序
# 计算差值
let rand_len=$num_length-2
for i in $(seq 0 $rand_len); do
new_list[$i]=`echo "${num_list[$(( i+1 ))]}-${num_list[$i]}+$minNum" | bc`
done
# echo "Diff Array:"
echo "${new_list[*]}"
sum=0
for (( i=0;i<${#new_list[*]};i++ ))
do
let sum=sum+${new_list[$i]}
done
echo $sum
}
let SIZE_BYTES=100
let NUMBER=10
let minNum=5
SplitInteger
exit 0
执行:1
2
3$ sh SplitInteger.sh
8 12 6 16 9 12 11 9 5 12
100
BubbleSort
为冒泡排序方法,具体实现参考Linux Bash编程:字符串处理。
本文标题:Linux Bash编程:将整数分解为n个随机数
文章作者:hiyo
文章链接:https://hiyongz.github.io/posts/linux-shell-bash-splitinteger/
许可协议:本博客文章除特别声明外,均采用CC BY-NC-ND 4.0 许可协议。转载请保留原文链接及作者。