I want to create a random number, but the number should be used only one time so that a number don't turn up twice.
I made a working sample with 6 random numbers.
In code row nr. 63 I check if the number I already used turn up again:
B4X:
If rndNr = usedNr(1) OR rndNr = usedNr(2) OR rndNr = usedNr(3) OR rndNr = usedNr(4) OR rndNr = usedNr(5) OR rndNr = usedNr(6) Then
(Attached is the sample program)
Is there a smater (and shorter) way to check for used numbers? Because in my app I need to check 44 numbers.
All the code:
B4X:
Sub Globals
Private btnRndNr As Button
Private labRndNr As Label
Dim rndNr As Int
Dim usedNr(7) As Int
Dim count As Int
count = 1
Private labCount As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Main")
End Sub
Sub btnRndNr_Click
rndNr = Rnd(1, 7) ' Create random nr. 1 to 6
' If random nr. was used already, start again
If rndNr = usedNr(1) OR rndNr = usedNr(2) OR rndNr = usedNr(3) OR rndNr = usedNr(4) OR rndNr = usedNr(5) OR rndNr = usedNr(6) Then
btnRndNr_Click
Else ' Else display random nr.
labRndNr.Text = "Rnd Nr. = " & rndNr
usedNr(count) = rndNr 'usedNr get value
'counter
labCount.Text = "Count = " & count
count = count +1
If count = 7 Then 'If counter is 7, reset to 1 and set usedNr to 0
count = 1
For i = 0 To 6
usedNr(i) = 0
Next
End If
End If
End Sub
Sub Globals
Private btnRndNr As Button
Private labRndNr As Label
Dim rndNr As Int
Dim usedNr(7) As Int
Dim count As Int
count = 1
Private labCount As Label
Dim rnums As String ' <- change!!!
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Main")
rnums="," ' <- change!!!
End Sub
Sub btnRndNr_Click
rndNr = Rnd(1, 42) ' Create random nr. 1 to 6
Do While rnums.Contains("," & rndNr & ",")
rndNr = Rnd(1, 42)
Loop
rnums=rnums & rndNr & ","
Log (rndNr & " > " & rnums)
End Sub
the only negative part about this code is that it might run in an infinite loop when all numbers have been picked.
Thank you.
I have to declare "rnums As String", right?
I think you are right with the fear of the infinite loop.
Isn't it a possibility to use "If .. Then" insted of "Do While .. Loop", similar to my example?
yes, notice the ' <- change in the source a few posts back
you can use an if/then indeed but then you either need to define all these 44 items inthere
or wrap it up in a loop to scan values in an array or something.
problem there is when a value matches you can't jump to the top again so you'll end up with more code than what you have now.
that's where the do while/loop comes to the rescue.
@eps
It don't have to be 100% random for my propose. I need it to make a quiz-app and I want to cover evenly all questions without missing some and some show up to often. I looked at the result of the code and it looked random enough or me.
@sorex
My last post was before I read your answer (you was to fast) and before I understood fully the code you posted.
I implemented your code in my example and it is working fine. Thanks again.
B4X:
Sub btnRndNr_Click
rndNr = Rnd(1, 7) ' Create random nr. 1 to 6
Do While rnums.Contains("," & rndNr & ",")
rndNr = Rnd(1, 7)
Loop
rnums=rnums & rndNr & ","
Log (rndNr & " > " & rnums)
labRndNr.Text = "Rnd Nr. = " & rndNr
'counter
labCount.Text = "Count = " & count
count = count +1
If count = 7 Then 'If counter is 7, reset to 1
count = 1
rnums=","
End If
End Sub
Sub RndUniqueNums(MinValue As Int, MaxValue As Int, NumOfValues As Int) As List
Private lstAvailable As List
lstAvailable.Initialize
For N = MinValue To MaxValue
lstAvailable.Add(N)
Next
Private Available As Int
Available = MaxValue - MinValue + 1
Private RetList As List
RetList.Initialize
Private NumDispIdx As Int
For i=0 To NumOfValues-1
NumDispIdx = Rnd(1, Available+1)-1
RetList.Add(lstAvailable.Get(NumDispIdx))
lstAvailable.RemoveAt(NumDispIdx)
Available = Available -1
Next
Return RetList
End Sub
with which you get a list of integers different from each other.
[numbers between MinValue and MaxValue]
[It is old stuff. Looking at it now may be wrong.
I could pass MinValue = 1, MaxValue = 10 and ask for NumOfValues = 20]
@MikeSimpson no problem, I understood (mostly) what you were attempting to achieve, but just wanted to be clear that we're not really talking about random numbers - you already know that but others might not.