Discuss Scratch
- Discussion Forums
- » Help with Scripts
- » Random number but not the previous one
- zvido
- Scratcher
2 posts
Random number but not the previous one
Hi,
I am trying to create a script in which a random number between 1 and 4 is generated. Based on the number generated certain things will happen. Then I want the program to select another random number between 1 and 4 but not the same one that was previously used until all four numbers are selected. The script seems to work well for the first three rounds but then it sometimes works on the fourth round and sometimes it stops. I have no idea why. (I put in a meow sound for debugging purposes, sometimes I hear it and the script loops around and at others no meow and the program stops.) Any ideas on how to make this work all the time would be greatly appreciated. Alternative ideas for achieving the same result are also great.
Here is a link to screen shot of the script.
http://torahskills.org/tsresources/images/jfs/scratch.png
I am trying to create a script in which a random number between 1 and 4 is generated. Based on the number generated certain things will happen. Then I want the program to select another random number between 1 and 4 but not the same one that was previously used until all four numbers are selected. The script seems to work well for the first three rounds but then it sometimes works on the fourth round and sometimes it stops. I have no idea why. (I put in a meow sound for debugging purposes, sometimes I hear it and the script loops around and at others no meow and the program stops.) Any ideas on how to make this work all the time would be greatly appreciated. Alternative ideas for achieving the same result are also great.
Here is a link to screen shot of the script.
http://torahskills.org/tsresources/images/jfs/scratch.png
Last edited by zvido (Aug. 19, 2013 20:19:42)
- CrystalStar-
- Scratcher
100+ posts
Random number but not the previous one
As you never reset B1- 4, maybe 4 is already set to a good number?
Try setting all the variables to 0 every time you start a completely new round at 1.
Try setting all the variables to 0 every time you start a completely new round at 1.
- DadOfMrLog
- Scratcher
1000+ posts
Random number but not the previous one
The reason it gets stuck is because you have “or (b2=B1)” in the final “if” (should be b4 rather than b2).
(BTW, why do you need those “ifs” anyway? If it's still within the repeat loop then the conditions must be true…?)
However, here's an alternative suggestion how to do this, in a more generic way (that you can expand in the future)…
How about putting numbers 1 to N into a list (N=4 in your example), and then repeat the following N times: pick a random from 1 to length of list, get that item (maybe add into another list), and then delete the item that was picked.
So something like this (hope I get this right - even if not, hopefully you'll get the idea):
delete all of numsToPick
set pos to 0
repeat N
change pos by 1
add pos to numsToPick
delete all of numsPicked
repeat N
set pos to (pick random 1 to length of numsToPick)
add (item pos of numsToPick) to numsPicked
delete (pos) of numsToPick
Now you have a list, numsPicked, which contains the numbers 1 to N in a random order, and you can do whatever you want with them…
Hope that helps!
EDIT: you could even define a custom block for above: “randomize values (start) to (end)”, say - in that case, you'd replace N with “end-start+1” and you'd start by setting pos to “start-1” rather than “0” - this way means you don't necessarily have to have the set of numbers going from 1 to N, but from “start” to “end”.
Now you can just drop this custom block wherever you want to generate a randomly ordered list of non-repeating integers.
(BTW, why do you need those “ifs” anyway? If it's still within the repeat loop then the conditions must be true…?)
However, here's an alternative suggestion how to do this, in a more generic way (that you can expand in the future)…
How about putting numbers 1 to N into a list (N=4 in your example), and then repeat the following N times: pick a random from 1 to length of list, get that item (maybe add into another list), and then delete the item that was picked.
So something like this (hope I get this right - even if not, hopefully you'll get the idea):
delete all of numsToPick
set pos to 0
repeat N
change pos by 1
add pos to numsToPick
delete all of numsPicked
repeat N
set pos to (pick random 1 to length of numsToPick)
add (item pos of numsToPick) to numsPicked
delete (pos) of numsToPick
Now you have a list, numsPicked, which contains the numbers 1 to N in a random order, and you can do whatever you want with them…
Hope that helps!
EDIT: you could even define a custom block for above: “randomize values (start) to (end)”, say - in that case, you'd replace N with “end-start+1” and you'd start by setting pos to “start-1” rather than “0” - this way means you don't necessarily have to have the set of numbers going from 1 to N, but from “start” to “end”.
Now you can just drop this custom block wherever you want to generate a randomly ordered list of non-repeating integers.
Last edited by DadOfMrLog (Aug. 19, 2013 21:57:03)
Alternate account: TheLogFather –– HowTos and useful custom blocks (see studio). Examples below…
- String manipulation - - - X to power of Y - - - Clone point to clone - Detect New Scratcher - Speed tests studio -
- zvido
- Scratcher
2 posts
Random number but not the previous one
Thank you both for taking the time to reply.
CrystalStar, I did try your idea but that did not seem to help. Thanks again for trying.
DadofMrLog, you are right there was a typo in the bottom line and changing b4 to b2 did the trick (can't believe I missed that). Also, you are right, I do not need the IF statements. I am new to Scratch and am just getting my feet wet.
I tried following your other suggestion but got lost along the way. I am sure others will find it useful and maybe I will understand it as I get more familiar with Scratch. For now, I am hoping this script should do the trick.
The most important thing I learned was the Scratch board/community is great!!
Thanks folks!
zvido
CrystalStar, I did try your idea but that did not seem to help. Thanks again for trying.
DadofMrLog, you are right there was a typo in the bottom line and changing b4 to b2 did the trick (can't believe I missed that). Also, you are right, I do not need the IF statements. I am new to Scratch and am just getting my feet wet.
I tried following your other suggestion but got lost along the way. I am sure others will find it useful and maybe I will understand it as I get more familiar with Scratch. For now, I am hoping this script should do the trick.
The most important thing I learned was the Scratch board/community is great!!
Thanks folks!
zvido
Last edited by zvido (Aug. 19, 2013 22:31:03)
- birchyboii
- Scratcher
100+ posts
Random number but not the previous one
Thats actually a nice idea NZombeh its simple, the only downfall is there would be alot of unnecessary scripts as you would have to create broadcasts for every combination
- goodgames8376
- Scratcher
8 posts
Random number but not the previous one
http://scratch.mit.edu/projects/21934190/ Is a times table game I made and it never repeats the same number.I hope it helps!
- digthebone
- Scratcher
500+ posts
Random number but not the previous one
say (pick random (1) to (4)) for (2) secs
or if you want it to set a variable to a number 1 through 4:
set [random variable v] to (pick random (1) to (4))
or if you want it to move 1 to 4 steps
move (pick random (1) to (4)) steps
get the idea?Hope you did
forever
say [ok buddy u awesome ] for (2) secs
if <person hates you> then
say [ok buddy u bad bro] for (2) secs
end
end
Digthebone
I make stuff. And I am always digging for new idea's.
- scratchmouse
- Scratcher
70 posts
Random number but not the previous one
http://scratch.mit.edu/projects/21934190/ Is a times table game I made and it never repeats the same number.I hope it helps!Hi, I like your idea very much and I have decided to make a visualization in which the sprite's speed depends on the (remaining) current distance, in my case Y-difference only, from the coordinates the sprite is moving towards. I created new block to implement the idea inside this project http://scratch.mit.edu/projects/24510942 It is not finished yet, as I want to add the “follow through” (and oscillation) idea which is described in this Wikipedia article here (that I edited when exploring the animation basics).
˙˙˙ ˙˙ ˙Ignore˙ ˙˙ ˙˙˙
… .. ˇˇˇ ˇˇˇ ˇˇˇ ˇˇˇ .. …
::: :: … ˇˇˇ ˇˇˇ … :: :::
- coxy5
- Scratcher
100+ posts
Random number but not the previous one
I am not sure if this was solved or not. I think it was but the code used looks complicated. I would use a list to solve this problem.
You then have a list of 1-4 in a random order.
Simply use:
To use the numbers.
when green flag clicked
set [i v] to [0]
repeat (4)
change [i v] by (1)
insert (i) at (random v) of [numbers v]
end
You then have a list of 1-4 in a random order.
Simply use:
(item (1 v) of [numbers v])
(item (2 v) of [numbers v])
(item (3 v) of [numbers v])
(item (4 v) of [numbers v])
To use the numbers.
Last edited by coxy5 (July 11, 2014 10:47:02)
- RandomPerson1789
- Scratcher
100+ posts
Random number but not the previous one
set [a v] to (pick random (1) to (4)There is another way, but this is the easy way.
set [b v] to (pick random (1) to (4)
repeat until <not <(b) = (a)>>
set [b v] to (pick random (1) to (4)
end
Hope this helps.
- Harakou
- Scratcher
1000+ posts
Random number but not the previous one
I'm afraid this topic is rather old and it seems the OP is satisfied with the answers they've received - closing to prevent any more unnecessary bumping.
- Discussion Forums
- » Help with Scripts
- » Random number but not the previous one