我正在尝试使坐标“ x”在[-1,1]区间内随机移动。但是,我的代码有时有效,有时却无效。我尝试了ShellCheck,但显示“未检测到问题!”。我是新手,有条件吗?
我正在Linux的Windows子系统上运行它。我正在nano上进行编辑。由于我有一个脚本可以绘制其中200条“随机游走”脚本,因此代码应始终如一地工作,但是我真的不明白为什么它不起作用。
这是我的代码:
x=0
for num in {1..15}
do
r=$RANDOM
if [[ $r -lt 16383 ]]
then
p=1
else
p=-1
fi
if [[ $x -eq $p ]]
then
x=$(echo "$x-$p" | bc )
else
x=$(echo "$x+$p" | bc )
fi
echo "$num $x"
done
我希望这样:
1 -1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
9 1
10 0
11 -1
12 0
13 1
14 0
15 1
但是通常的输出是这样的:
1 1
2 0
3 -1
4 0
5 -1
6 0
7 -1
(standard_in) 1: syntax error
8
(standard_in) 1: syntax error
9
(standard_in) 1: syntax error
10
(standard_in) 1: syntax error
11
(standard_in) 1: syntax error
12
(standard_in) 1: syntax error
13
(standard_in) 1: syntax error
14
(standard_in) 1: syntax error
15
总是在-1之后停止。
答案 0 :(得分:4)
您可以使用bash
进行此操作:
x=$(( x - p ))
或
(( x -= p ))
您不需要bc
。
答案 1 :(得分:2)
将x=$(echo "$x-$p" | bc )
替换为x=$(echo "$x-($p)" | bc )
,以避免echo "-1--1" | bc
。
答案 2 :(得分:1)
使用bash
算术评估:
x=0; printf '%-5s\n' {1..15}\ $(( x=(RANDOM%2 ? 1 : -1) * (x==0) ))
x=0; printf '%-5s\n' {1..15}\ $(( x=( x ? 0 : (RANDOM%2 ? 1 : -1) ) ))
任何一个的样本输出(第二个列在运行之间会有所不同):
1 -1
2 0
3 -1
4 0
5 1
6 0
7 1
8 0
9 -1
10 0
11 1
12 0
13 -1
14 0
15 -1
工作原理:
echo {1..15}\ $(( ...some code... ))
将数字 1 打印到
在$(( ... ))
代码中返回的所有结果的 15 后跟 15 实例。这种方法的一个缺点是生成的 15 对数字(例如 1 -1
,2 0
,等。),则每个bash
都显示为一个字符串,而不是单独的 30 数字。(RANDOM%2)
:%
是modulo operator,并且在除以2
或{{1} 。0
:1
可以是三个数字之一,但是如果(x==0)
的先前值为$x
或$x
,则唯一合法的随机步是-1
,因此,如果1
的前一个值为0
,我们只需要一个随机数。 $x
逻辑替换为 0
形式的快捷方式;这些使用与OP脚本相同的逻辑。