Android Question Random numbers without repetition

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
 

behnam_tr

Active Member
Licensed User
Longtime User
code by deepseek AI

B4X:
' ========================================================
' 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
 
Upvote 0

behnam_tr

Active Member
Licensed User
Longtime User
B4X:
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
 
Last edited:
Upvote 0
B4X:
' ========================================================
' 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)
 
Upvote 0
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
 
Upvote 0

josejad

Expert
Licensed User
Longtime User
Thanks, but I don't want it to be in order. I want it to be random without repetition.
You add them in order, but later you shuffle the list with the code in the link
 
Upvote 0
Top