Hello friends
I want to use a random number in my program without repetitions, giving it a number from 1 to 10, each button is assigned a number, but there are no repetitions
Can anyone help me?
For example
r=rnd(1,10)
lbl1.text=8
lbl2.text=2
lbl3.text=5
lbl4.text=1
lbl5.text=3
lbl6.text=10
lbl7.text=7
lbl8.text=6
lbl9.text=4
lbl10.text=9
' ========================================================
' Function: Assigns unique random numbers (1-10) to labels
' Input: Labels (List of strings)
' Output: Map (Label → Unique random number)
' ========================================================
Sub AssignUniqueRandomNumbers(Labels As List) As Map
Dim Numbers As List
Numbers.Initialize
' Step 1: Generate a list of numbers 1 to 10
For i = 1 To 10
Numbers.Add(i)
Next
' Step 2: Shuffle the list randomly
ShuffleList(Numbers)
' Step 3: Map each label to a unique number
Dim LabelToNumber As Map
LabelToNumber.Initialize
For i = 0 To Labels.Size - 1
Dim lbl As String = Labels.Get(i)
Dim num As Int = Numbers.Get(i)
LabelToNumber.Put(lbl, num)
Next
Return LabelToNumber
End Sub
' ========================================================
' Helper Sub: Shuffles a list using Fisher-Yates algorithm
' Input: List (to be shuffled)
' ========================================================
Sub ShuffleList(List As List)
Dim rnd As Random
rnd.Initialize
' Start from the last element and swap with a random previous element
For i = List.Size - 1 To 1 Step -1
Dim j As Int = rnd.Next(0, i + 1) ' Random index between 0 and i
' Swap elements at positions i and j
Dim temp As Object = List.Get(i)
List.Set(i, List.Get(j))
List.Set(j, temp)
Next
End Sub
B4X:
Sub AppStart (Args() As String)
' Example list of labels
Dim Labels As List
Labels.Initialize
Labels.AddAll(Array As String("Label1", "Label2", "Label3", "Label4", "Label5", _
"Label6", "Label7", "Label8", "Label9", "Label10"))
' Call the function
Dim Result As Map = AssignUniqueRandomNumbers(Labels)
' Log the results (e.g., "Label1 → 3")
For Each Key As String In Result.Keys
Log(Key & " → " & Result.Get(Key))
Next
End Sub
Sub GenerateRandomUniqueNumbers As List
Dim Numbers As List
Numbers.Initialize
' Step 1: Create a list with numbers 1 through 10
For i = 1 To 10
Numbers.Add(i)
Next
' Step 2: Shuffle the list to randomize order
ShuffleList(Numbers)
' Step 3: Return the shuffled list
Return Numbers
End Sub
Sub ShuffleList(List As List)
' Start from last element and move backward
For i = List.Size - 1 To 1 Step -1
' Generate random index between 0 and current position
Dim j As Int = Rnd(0, i + 1)
' Swap elements at positions i and j
Dim temp As Int = List.Get(i)
List.Set(i, List.Get(j))
List.Set(j, temp)
Next
End Sub
B4X:
Sub AppStart (Args() As String)
Dim RandomNumbers As List = GenerateRandomUniqueNumbers
Log("Shuffled numbers (1-10):")
For Each num As Int In RandomNumbers
Log(num)
Next
End Sub
' ========================================================
' Function: Generates a list of random unique numbers (1-10)
' Returns: List of integers (shuffled order, no duplicates)
' ========================================================
Sub GenerateRandomUniqueNumbers As List
Dim Numbers As List
Numbers.Initialize
' Step 1: Create a list with numbers 1 through 10
For i = 1 To 10
Numbers.Add(i)
Next
' Step 2: Shuffle the list to randomize order
ShuffleList(Numbers)
' Step 3: Return the shuffled list
Return Numbers
End Sub
' ========================================================
' Helper Sub: Shuffles a list using Fisher-Yates algorithm
' Input: List - the list to be shuffled (modified in-place)
' ========================================================
Sub ShuffleList(List As List)
Dim rnd As Random
rnd.Initialize ' Initialize random number generator
' Start from last element and move backward
For i = List.Size - 1 To 1 Step -1
' Generate random index between 0 and current position
Dim j As Int = rnd.Next(0, i + 1)
' Swap elements at positions i and j
Dim temp As Int = List.Get(i)
List.Set(i, List.Get(j))
List.Set(j, temp)
Next
End Sub
B4X:
Sub AppStart (Args() As String)
' Generate shuffled numbers
Dim RandomNumbers As List = GenerateRandomUniqueNumbers()
' Display results in log
Log("Shuffled numbers (1-10):")
For Each num As Int In RandomNumbers
Log(num)
Next
End Sub
I had to make a few changes, but both gave this error.
An error occurred.
B4A line: 979
For i = list.Size - 1 To 1 Step -1
src\M\sh\khamirza\data\ta5.java:1874: error: cannot find symbol
_i = (int) (mostCurrent._list.getSize()-1) ;
^
symbol: method getSize()
location: variable _list of type list
____________
I deleted these lines.
Dim rnd As Random
rnd.Initialize
______
I also changed this line.
Dim j As Int = rnd.Next(0, i + 1)
to
Dim j As Int = rnd(0, i + 1)
Thanks friends
This code solved my problem. I said let the rest of you use it if necessary.
b4x:
Sub Process_Globals
Private randomNumbers As List
Private buttons As List
End Sub
Sub Globals
Private Button1 As Button
Private Button2 As Button
Private Button3 As Button
Private Button4 As Button
Private Button5 As Button
Private Button6 As Button
Private Button7 As Button
Private Button8 As Button
Private Button9 As Button
Private Button10 As Button
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
randomNumbers.Initialize
buttons.Initialize
buttons.Add(Button1)
buttons.Add(Button2)
buttons.Add(Button3)
buttons.Add(Button4)
buttons.Add(Button5)
buttons.Add(Button6)
buttons.Add(Button7)
buttons.Add(Button8)
buttons.Add(Button9)
buttons.Add(Button10)
GenerateRandomNumbers()
AssignNamesToButtons()
End Sub
Sub GenerateRandomNumbers()
Dim tempList As List
tempList.Initialize
For i = 1 To 10
tempList.Add(i)
Next
Do While tempList.Size > 0
Dim index As Int = Rnd(0, tempList.Size)
randomNumbers.Add(tempList.Get(index))
tempList.RemoveAt(index)
Loop
End Sub
Sub AssignNamesToButtons()
For i = 0 To randomNumbers.Size - 1
Dim btn As Button = buttons.Get(i)
btn.Text = "Button " & randomNumbers.Get(i)
Next
End Sub