在“随机行走”脚本上是否满足条件的问题

时间:2019-08-29 05:21:56

标签: bash if-statement conditional-statements

我正在尝试使坐标“ 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之后停止。

3 个答案:

答案 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 算术评估

,等效于OP的18行随机游走脚本
  1. x=0; printf '%-5s\n' {1..15}\ $(( x=(RANDOM%2 ? 1 : -1) * (x==0) ))
  2. 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 -12 0等。),则每个bash都显示为一个字符串,而不是单独的 30 数字。
  • (RANDOM%2)%modulo operator,并且在除以2或{{1} 。
  • 01可以是三个数字之一,但是如果(x==0)的先前值为$x$x,则唯一合法的随机步是-1,因此,如果1的前一个值为0,我们只需要一个随机数。
  • $x逻辑替换为 0 形式的快捷方式;这些使用与OP脚本相同的逻辑。