我需要在bash中随机生成一系列“a”和“-a”。我必须具有相等数量的“a”和“-a”,这意味着数组的总和应为零。类似的东西:
n=20;
for i in seq 1 1 n
do
if test $RANDOM -ge 16378
then
a=1
else
a=-1
fi
done
与此类似的东西,将以随机方式生成“a”和“-a”,但总和不会总是为零。我应该如何在代码中应用这个条件?!
感谢名单
答案 0 :(得分:2)
我会将您的问题解释为等同于创建一个已知长度的数组,其中包含一些a
和相同数量的-a
,然后获得该数组的随机排列。
您需要在bash
中执行此操作吗?如果是这样,您可以先创建一个所需长度的数组,然后将其洗牌。
来自BashFaq:
此函数使用Knuth-Fisher-Yates shuffle算法就地对阵列的元素进行混洗。
#!/bin/bash
shuffle() {
local i tmp size max rand
# $RANDOM % (i+1) is biased because of the limited range of $RANDOM
# Compensate by using a range which is a multiple of the array size.
size=${#array[*]}
max=$(( 32768 / size * size ))
for ((i=size-1; i>0; i--)); do
while (( (rand=$RANDOM) >= max )); do :; done
rand=$(( rand % (i+1) ))
tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
done
}
(从Simple method to shuffle the elements of an array in BASH shell?复制)
如果您不限于bash
,则只需使用shuf
和for
循环即可do it as a one-liner。
答案 1 :(得分:2)
我正在添加一个单独的答案,因为您实际上可能正在寻找更简单的东西。如果你想以随机顺序遍历20个值,其中10个是1
,其中10个是-1
,我会这样做:
$ for i in {1..10}; do echo 1; echo -1; done | shuf
-1
1
-1
1
-1
1
-1
1
1
1
-1
1
-1
-1
-1
-1
1
1
1
-1
答案 2 :(得分:0)
非常简单,你只需要学会更好地使用RANDOM。
要在范围内获得随机数,请按范围的长度对其进行修改。在这种情况下,它是二进制的,所以$((RANDOM%2))
declare -i total=0 # you need to define this as an integer for += later
for i in {1..20}; do
declare -i num=$((RANDOM % 2)) # define an integer var
[ $num -lt 1 ] && ((--num)) # if it's zero, change to -1
echo $num # see the number picked
total+=$num
done
echo "total = $total"
我假设你想看到结果。如果你想总结它,那么我们在循环外声明一个变量,然后使用它。我将在其中进行编辑。
答案 3 :(得分:-1)
这可能就是你想要的。它产生一个随机数'a'和'-a的组合,每个数字的一半,使字符串中'a'的数量等于字符串中'-a'的数量。告诉我,如果我误解了这个问题。 字符串的最大长度可以限制,告诉我是否需要
Path=
编辑:已添加对代码的评论,如SaintHax所建议的