2 shaved off 2 characters, made it run 30 turns.

## J 4442 characters - 50 -10 = -1618

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<20<@#)(i.=1=?)30~30

init=: (i.0=?~30 = ?)        NB. where is the random value from 0 to 29 equal
NB. toin the natural number 0 to 29, generatingrandom onepermutation 1of [0, 29 0's.29]
rep =: ^:(<20<@#)         NB. repeat 20as many times as the array is long, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init 30

NB. Amounts of ones in each column (sum)
]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)(i.=0=?)30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
+/a NB. check the number of ones in total
1000
|. |:(<.a%10) #"0 1] '*' NB. plot of those values
*
*
***
***
****
****
****
******
******
******
*******
*******
********
********
**********
**************

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________


## J 44 characters - 50 -10 = -16

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<20)(i.=?)30

init=: (i. = ?)        NB. where is the random value from 0 to 29 equal
NB. to the natural number 0 to 29, generating one 1 , 29 0's.
rep =: ^:(<20)         NB. repeat 20 times, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init 30

NB. Amounts of ones in each column (sum)
]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)(i.=?)30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
+/a NB. check the number of ones in total
1000
|. |:(<.a%10) #"0 1] '*' NB. plot of those values
*
*
***
***
****
****
****
******
******
******
*******
*******
********
********
**********
**************

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________


## J 42 characters - 50 -10 = -18

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<@#)1=?~30

init=: 0=?~30          NB. where is the 0 in the random permutation of [0,29]
rep =: ^:(<@#)         NB. repeat as many times as the array is long, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init

NB. Amounts of ones in each column (sum)
]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)0=?30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
+/a NB. check the number of ones in total
1000
|. |:(<.a%10) #"0 1] '*' NB. plot of those values
*
*
***
***
****
****
****
******
******
******
*******
*******
********
********
**********
**************

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

1

## J 44 characters - 50 -10 = -16

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<20)(i.=?)30


Explanation, starting from the right (some knowledge about trains comes in handy):

init=: (i. = ?)        NB. where is the random value from 0 to 29 equal
NB. to the natural number 0 to 29, generating one 1 , 29 0's.
rep =: ^:(<20)         NB. repeat 20 times, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init 30


Center tendency, -50, example over 1000 runs:

NB. Amounts of ones in each column (sum)
]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)(i.=?)30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
+/a NB. check the number of ones in total
1000
|. |:(<.a%10) #"0 1] '*' NB. plot of those values
*
*
***
***
****
****
****
******
******
******
*******
*******
********
********
**********
**************


Example run, outputting exactly 30 bytes each line

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________