Clay Pigeon Flush Controller, help required.
paulmoreland
Posts: 4
I'm looking for some assistance with the code below as I've gone code blind.
The basic premise is i want to generate and random number between 1-5 to represent how many times a relay will be fired in a "cycle". Then based upon this how many I need to generate another random number between 0-4 (though it never seems to generate a 4?) to represent which relay will fire for each of iterations. So if this time how many was 3 I would need 3 numbers between 0-4. The problem I have is that these need to be unique.
Each trap relay will send 2 birds and the whole program is supposed to deliver 250 birds hence the outer loop and the line birdsThisTime=numTraps*2, this seems to work OK.
The main bit I'm missing is the whichTrap duplication, I write the values into an array as I wanted the logic to 1. check if whichTrap is already in the array trapNos and if it is generate another and if it's not add to the array.
Is there a smarter way to avoid duplication as that's the only reason I have the array as I believe that was the easiest way managing it.
Any help appreciated.
The basic premise is i want to generate and random number between 1-5 to represent how many times a relay will be fired in a "cycle". Then based upon this how many I need to generate another random number between 0-4 (though it never seems to generate a 4?) to represent which relay will fire for each of iterations. So if this time how many was 3 I would need 3 numbers between 0-4. The problem I have is that these need to be unique.
Each trap relay will send 2 birds and the whole program is supposed to deliver 250 birds hence the outer loop and the line birdsThisTime=numTraps*2, this seems to work OK.
The main bit I'm missing is the whichTrap duplication, I write the values into an array as I wanted the logic to 1. check if whichTrap is already in the array trapNos and if it is generate another and if it's not add to the array.
Is there a smarter way to avoid duplication as that's the only reason I have the array as I believe that was the easiest way managing it.
' {$STAMP BS2sx} ' {$PBASIC 2.5} i VAR Nib x VAR Nib numTraps VAR Nib whichTrap VAR Nib numBirdsTOT VAR Byte trapNos VAR Byte(10)' Create a 10-byte array result VAR Word resultTrap VAR Word birdsThisTime VAR Nib numBirdsTOT = 0 LOW 15 i=0 DO WHILE (numBirdsTOT < 250) ' sets up outer loop to count 250 birds 'first get how many of the 5 traps to fire numTraps=(result//5+1) RANDOM result' generate random number DEBUG "**********************************" DEBUG CR DEBUG DEC ? numTraps DEBUG CR whichTrap=0 i=0 FOR i=0 TO numTraps-1 whichTrap=(result//4) ' issue with not generating a 4 RANDOM result' generate random number DEBUG DEC ? whichTrap DEBUG CR 'before writing to the array need to check if whichTrap already there, this is what's missing trapNos(i) = whichTrap NEXT FOR i=0 TO numTraps-1 DEBUG "trapNos(" DEBUG DEC i DEBUG ")=" DEBUG DEC trapNos(i) DEBUG CR HIGH i PAUSE 200 LOW i NEXT 'set birdsThisTime birdsThisTime=numTraps*2 ' each relay will fire 2 traps 'need to check if birdsthis time would exceed max nuBirdsTot of 250 IF birdsThisTime + numBirdsTOT > 250 THEN numBirdsTOT = numBirdsTOT - birdsThisTime ELSE numBirdsTOT = numBirdsTOT + birdsThisTime ENDIF birdsThisTime=0 numTraps=0 LOOP HIGH 15 DEBUG CR DEBUG "End of sequence" numBirdsTOT=0
Any help appreciated.
This discussion has been closed.
Comments
One way to improve this is to add some element of actual randomness. For example, a human having to press a button. While the program is waiting for the human it its manipulating the seed. As the human will react at a random time, the seed will be randomized.
This code will return a value between 0 and 3. Why? The // (modulus) operator divides by four and returns the remainder -- if you're dividing by 4 the remainder can only be 0 to 3. Change the 4 to a 5 and you'll get 0..4. Like you do in the earlier statement where you add one and bump the result to 1..5.
When posting listings you really should use the Code tags. Press the C on the toolbar above the edit field and then paste your code in between the tags. This will retain the formatting.