# Android Questionrandom number except of one number...

#### Gunther

##### Active Member
yes, not directly as you suggest, but do it with a loop:

B4X:
``````Dim intNewNumber As Int = Rnd(1, 10)
'
Do Until  (intNewNumber <> 2 or intNewNumber <> 5)

intNewNumber = Rnd(1, 10)

Loop
'``````
If the Number is 2 or 5 a new RND is taken.

#### sorex

##### Expert
something like this?

B4X:
``````dim r as int
r=2 ' might be needed to bypass an extra rnd call
do while r=2 or r=5
r = rnd(1,10)
loop``````

#### ilan

##### Expert
i made allready that kind of function but it makes my game flicker a little

B4X:
``````sub selectlevel
Dim lv As Int = randomfunction(maxlevels,pnl1.Tag)
end sub

'....
Sub randomfunction(maxint As Int,forbiddennr As Int) As Int

Dim rnd1 As Int = forbiddennr
Do Until rnd1 <> forbiddennr
rnd1 = Rnd(2,maxint)
Loop
Return rnd1

End Sub``````

#### sorex

##### Expert
I wonder why it should flicker if it only needs 1 iteration (best case)?

#### JordiCP

##### Well-Known Member
Do the random for maxint minus one, and add one if the result is equal or more than forbiddennr

B4X:
``````Sub randomfunction(maxint As Int,forbiddennr As Int) As Int
Dim rnd1=Rnd(1,maxint-1)
if rnd1>=forbiddennr then
rnd1=rnd1+1
end if
End Sub``````

#### sorex

##### Expert
if the range is big enough you could risk

B4X:
``````dim r as int
r=rnd(1,10)
if r=2 or r=5 then r=rnd(1,10)``````
which should use less resources

#### sorex

##### Expert
is the range static?

#### ilan

##### Expert
Do the random for maxint minus one, and add one if the result is equal or more than forbiddennr

B4X:
``````Sub randomfunction(maxint As Int,forbiddennr As Int) As Int
Dim rnd1=Rnd(1,maxint-1)
if rnd1>=forbiddennr then
rnd1=rnd1+1
end if
End Sub``````
what if the last number was = maxint then it can be that the same level will be loaded again

#### ilan

##### Expert
is the range static?
i have for example 10 levels

and i want load them randomly but i dont want a level appear twice
so i want to avoid the same level will be loaded again

i tried also

B4X:
``````Dim lv As Int = Rnd(2,maxlevels+1) 'choose random level except of level1 and same level
If lv <> pnl1.Tag Then
pnl2.Tag = lv
Else
pnl2.Tag =  Min((pnl1.Tag+1),maxlevels)
End If``````

#### ilan

##### Expert
if the range is big enough you could risk

B4X:
``````dim r as int
r=rnd(1,10)
if r=2 or r=5 then r=rnd(1,10)``````
which should use less resources
to risky

#### Gunther

##### Active Member
Well, here is an other one!

But the forbidden numbers need not be in a row, e.g. 2,3 or 6,7 and never 9!

B4X:
``````dim r as int
r=rnd(1,10)
if r=2 or r=5 then r = r + 1``````
This is faster but not that flexible as my first one.

#### Gunther

##### Active Member
what you mean by ?

"...load them randomly but i dont want a level appear twice..."

1) all 10 levels shall be used once and than never again?
2) or not directly after a level is done?

for 1) you may shuffle the number in the beginnig and doing a list from 1 to 10
for 2) see #14 or #2

#### ilan

##### Expert
Well, here is an other one!

But the forbidden numbers need not be in a row, e.g. 2,3 or 6,7 and never 9!

B4X:
``````dim r as int
r=rnd(1,10)
if r=2 or r=5 then r = r + 1``````
This is faster but not that flexible as my first one.
this will not work

#### Troberg

##### Well-Known Member
Put the allowed numbers in an array, then simply pick an item from the array at random. Slower if you only need to do it occasionally, but if you need to do it often and can prepare the array in advance, it will be fast, and it will have a predictable running time, which the loop methods won't.

#### sorex

##### Expert
shuffle a level array at each game start

B4X:
``````Dim r As Int
Dim t As Int
Dim levels() As Int=Array As Int(1,2,3,4,5,6,7,8,9,10)
For x=0 To levels.Length-1
r=Rnd(0,levels.Length)
t=levels(r)
levels(r)=levels(x)
levels(x)=t
Next
Log(levels(0))``````
chances that the levels will be the same in a row az the previous game are very unlikely

#### ilan

##### Expert
what you mean by ?

"...load them randomly but i dont want a level appear twice..."

1) all 10 levels shall be used once and than never again?
2) or not directly after a level is done?

for 1) you may shuffle the number in the beginnig and doing a list from 1 to 10
for 2) see #14 or #2
i want the levels load randomly again and agian but not same level twice after he was loaded.
but he can be again loaded if another level was before

like 2,4,5,3,2,4,2,6,7,5,6,7,....

#### Troberg

##### Well-Known Member
Well, here is an other one!

But the forbidden numbers need not be in a row, e.g. 2,3 or 6,7 and never 9!

B4X:
``````dim r as int
r=rnd(1,10)
if r=2 or r=5 then r = r + 1``````
This is faster but not that flexible as my first one.
That would give skewed probabilities, where 3 and 6 are twice as likely to appear as the other numbers.