Best way to have a number between #$00 and #$XX?
Moderator: Moderators
Best way to have a number between #$00 and #$XX?
What is the best routine in assembly to have a number from #$00 to a given number?
I have solution but they are complex, I think there is surely an easy with with the instructions?
I have solution but they are complex, I think there is surely an easy with with the instructions?
Re: Best way to have a number between #$00 and #$XX?
Do you mean like generating a random number between 0 and n?
Re: Best way to have a number between #$00 and #$XX?
yes exactly what I mean!!
doing
LDA $EF (random generator)
AND #$0F
Some number won't be obtained...
doing
LDA $EF (random generator)
AND #$0F
Some number won't be obtained...
Re: Best way to have a number between #$00 and #$XX?
How are you currently populating the value at address $00EF? What range did you want, and what do you plan to use the numbers for? Does the range vary from call to call? Sometimes this can inform which technique is best.
The general-purpose RNG I recommend nowadays is the LCG from cc65's C library. Sometimes, depending on the exact range I need and how quickly a value should repeat before being reused, I'll post-process the random stream with a least-recently-used generator, calculated over a circular buffer in a manner similar to RC4's mixer.
The general-purpose RNG I recommend nowadays is the LCG from cc65's C library. Sometimes, depending on the exact range I need and how quickly a value should repeat before being reused, I'll post-process the random stream with a least-recently-used generator, calculated over a circular buffer in a manner similar to RC4's mixer.
Re: Best way to have a number between #$00 and #$XX?
Working with any number that isn't a power of 2 is always tricky.
The way I've been doing it is having a table if values in ROM that's a power of two (The most i've needed is 8 so far, so that's what I've been using), and using a random number as the index for which to choose. Simple and quick.
Otherwise you have to use division, which is costly. IDK, I'm sure someone here has a better solution.
The way I've been doing it is having a table if values in ROM that's a power of two (The most i've needed is 8 so far, so that's what I've been using), and using a random number as the index for which to choose. Simple and quick.
Code: Select all
lda random
And #%00000111
Tax
Rts
Re: Best way to have a number between #$00 and #$XX?
Sogona: thanks I will use this way!! what is clever and what I was looking for!!
Re: Best way to have a number between #$00 and #$XX?
tepples wrote:How are you currently populating the value at address $00EF? What range did you want, and what do you plan to use the numbers for? Does the range vary from call to call? Sometimes this can inform which technique is best.
The general-purpose RNG I recommend nowadays is the LCG from cc65's C library. Sometimes, depending on the exact range I need and how quickly a value should repeat before being reused, I'll post-process the random stream with a least-recently-used generator, calculated over a circular buffer in a manner similar to RC4's mixer.
thanks! will look at it!!
- NovaSquirrel
- Posts: 483
- Joined: Fri Feb 27, 2009 2:35 pm
- Location: Fort Wayne, Indiana
- Contact:
Re: Best way to have a number between #$00 and #$XX?
I usually just keep trying until I get a number out of the randomizer that works. Like this is the code I would use if I wanted 0, 1, 2, 3 or 4 with equal chances:
Code: Select all
loop:
jsr random ; get a new random number, put it in the accumulator
and #7 ; cut down the range
cmp #5 ; throw out 5, 6 or 7
bcs loop
Re: Best way to have a number between #$00 and #$XX?
Another way to get nearly uniformly distributed numbers from 0 to 4 without the time-uncertainty of looping calls to your RNG is to multiply the RNG's output by 5.
For 5 choices in particular, you can treat values 0-203 one way and 204-255 another, such as returning 4 for all values 204+ and using bits 1-0 of values 0-203.
Code: Select all
jsr random
; Multiply A by 5/4 and keep bits 8-6
sta tmp0
lsr a
lsr a
clc
adc tmp0 ; C:A = 0 to 319
and #$C0 ; C:A = 0, 64, 128, 192, or 256
rol a
rol a
rol a
Code: Select all
jsr random
cmp #204
bcc not4
lda #4
bcs haveA
not4:
and #$03
haveA:
Re: Best way to have a number between #$00 and #$XX?
Just want to point out that's also exactly what I'd do.NovaSquirrel wrote:I usually just keep trying until I get a number out of the randomizer that works. Like this is the code I would use if I wanted 0, 1, 2, 3 or 4 with equal chances:Code: Select all
loop: jsr random ; get a new random number, put it in the accumulator and #7 ; cut down the range cmp #5 ; throw out 5, 6 or 7 bcs loop
Re: Best way to have a number between #$00 and #$XX?
thx!! it's actually the easiest solution!!Bregalad wrote:Just want to point out that's also exactly what I'd do.NovaSquirrel wrote:I usually just keep trying until I get a number out of the randomizer that works. Like this is the code I would use if I wanted 0, 1, 2, 3 or 4 with equal chances:Code: Select all
loop: jsr random ; get a new random number, put it in the accumulator and #7 ; cut down the range cmp #5 ; throw out 5, 6 or 7 bcs loop