# random varible

#### N0B0DY-1N-P4RT1CUL4R

##### Member
I'm trying to figure out how to get a variable to generate a random value between 1 and 4 then turn on a bulb that corresponds to that value but so far I'm just getting syntax errors, if you can point out the faults I would be very thankful
Code:
``````symbol delta = b0
max; b0 = 4
min; b0 = 1
random delta
if delta = 1 then{
high b.4
wait 2
low b.4}
if delta = 2 then{
high b.5
wait 2
low b.5}
if delta = 3 then{
high b.6
wait 2
low b.6}
if delta = 4 then{
high b.7
wait 2
low b.7}
set; b0 = 0``````

#### Buzby

##### Senior Member
Random needs a dedicated word variable to use. It must not be reset to zero after each use. The result is always a 16 bit number with the bits pseudo-randomly set.

The line with the modulo divide ( // ) makes a number from 1 to 4.

Note: There are a couple of gotchas with the random function.
First, the random number sequence will always be the same each time the Picaxe is started. There are a couple of solutions to this.
Second, the next random number is reasonably predictable, if you put enough effort in !. There is a solution to this as well.

( It's too late for me to go through the solutions tonight. )

Code:
``````symbol deltaRnd = w0
symbol delta    = b2

do
random deltaRnd  ' Run the 16 bit random number generator

delta = deltaRnd // 4 + 1 ' Make result 1 to 4

if delta = 1 then{
high b.4
wait 2
low b.4}
endif

if delta = 2 then{
high b.5
wait 2
low b.5}
endif

if delta = 3 then{
high b.6
wait 2
low b.6}
endif

if delta = 4 then{
high b.7
wait 2
low b.7}
endif

loop``````

#### hippy

##### Technical Support
Staff member
I have usually used something like below to make the number feel more random -

Code:
``````Symbol randomNumber = w1 ; b3:b2
Symbol this         = b4
Symbol last         = b5

Do
Random randomNumber
this = randomNumber / 17 // 4 + 1
If this <> last Then
last = this
SerTxd(#this, " ")
End If
Loop``````
The '/ 17' makes the number less sequential, the '// 4' creates a value 0 to 3. Using '& 3' would do the same in this case and be quicker. The '+ 1' makes it 1 to 4 though you could also handle 0 to 3 and avoid having that. Using 'this' and 'last' prevents the same number being used consecutively because that can make it feel non-random even though it is.

• #### Technoman

##### Senior Member
• #### PieM

##### Senior Member
In general, an input Pin needs to be pulled to either +Vcc or GND. If the input is just left floating, it will act like an aerial and generate random data. .

#### Buzby

##### Senior Member
If the input is just left floating, it will act like an aerial and generate random data. .
I wouldn't trust a floating input to give reliable random data. It's just as likely to stick at '1' or '0', then switch when some external effect happens.

This happened on a breadboard project I was developing. An input was floating because I'd not yet finished the hardware, but the code relating to the input was partly written. The project had some strange behaviour, which I traced to being due to the proximity of my hand near the breadboard.

Now I never leave an input floating during project development, and finished projects use 'PULLUP' to tame any unused pins.