Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Unique Random Array Program
#1
I got bored so I decided to test my programming skills.

Here is a simple program to fill an array of unique random numbers.

This is for making an array without duplicating similar values.

Also prompts to display duplicates and the unique array.

Code: (Select All)
Rem unique random array program. v1.0a QB64 PD source 2025.

Rem setup program and screen.
Option _ExplicitArray
$Checking:Off
Rem $Dynamic
DefLng A-Z
Randomize Timer
Const Version = "v1.0a"
_ScreenMove _Middle
_Title "Random Array Program"
Call Display.Status.Line(-1, "Random Array Program " + Version)
Screen 0
H = _Height
W = _Width
Locate H - 1, 1, 1

Rem start program.
Color 15
Print "Random Number Array List Program " + Version
Do
  _Title "Random Array Program"
  Color 12
  Print "Array elements";
  Input Num$
  If Num$ = "" Then Exit Do
  Num = Int(Val(Num$))
  If Num <= 0 Then Num = 128

  Print "List duplicates(y/n)?";
  Do
      _Limit 50
      v$ = InKey$
      If LCase$(v$) = "y" Then Print "y": Display = -1: Exit Do
      If LCase$(v$) = "n" Then Print "n": Display = 0: Exit Do
  Loop

  Duplicates = 0
  StartTimer = Timer
  DotTimer = Timer
  ReDim Array(1 To Num) As Long
  Array(1) = Int(Rnd * Num + 1) ' seed initial value.
  VarD = 0: VarE = 0: VarF! = Timer ' store display counters.
  For Element = 2 To Num
      ' loop through array checking for duplicates.
      Start:
      If Display = 0 Then
        TimeElapsed = Timer - DotTimer
        If TimeElapsed >= 1& Then
            DotTimer = Timer
            _Title "Random Array Program" + Str$(Duplicates)
            Call Dot.Display(VarD, VarE, VarF!)
        End If
      End If
      Var = Int(Rnd * Num + 1)
      For Test = 1 To Element - 1
        If Array(Test) = Var Then
            Duplicates = Duplicates + 1
            If InKey$ = Chr$(27) Then
              If Display = 0 Then
                  Call Clear.Dots
              End If
              Exit Do
            End If
            If Display Then
              Color 15
              Print "Duplicate("; LTrim$(Str$(Duplicates)); ")"; Test
            End If
            GoTo Start
        End If
      Next
      Array(Element) = Var
  Next
  If Display = 0 Then
      Call Clear.Dots
  End If
  TimeElapsed = Timer - StartTimer
  Color 14
  Print "Display array(y/n)?";
  Do
      _Limit 50
      v$ = InKey$
      If LCase$(v$) = "y" Then
        Print "y"
        Print "Unique array:";
        For Var = 1 To Num
            Print Array(Var);
        Next
        Print
        Exit Do
      End If
      If LCase$(v$) = "n" Then
        Print "n"
        Exit Do
      End If
  Loop
  Color 15
  Print "Duplicates:"; Duplicates
  Print "Elapsed time:"; TimeElapsed
Loop
Call Display.Status.Line(0, "")
Color 7
Print "End program."
End

Sub Dot.Display (VarA, VarB, VarC!)
  Color 15
  VarG! = Timer - VarC!
  If VarG! < 0! Then VarG! = VarG! + 86400!
  If VarG! >= 1! Then
      VarC! = Timer
      If VarA = 0 Then
        VarB = VarB + 1
        Print ".";
        If VarB = 5 Then
            VarA = -1
            VarB = 0
        End If
      Else
        VarB = VarB + 1
        Call Back.Space
        Print " ";
        Call Back.Space
        If VarB = 5 Then
            VarA = 0
            VarB = 0
        End If
      End If
  End If
End Sub

Sub Clear.Dots
  Do
      If Pos(0) > 1 Then
        Call Back.Space
      Else
        Exit Do
      End If
  Loop
End Sub

Sub Back.Space
  If Pos(0) > 1 Then
      Locate CsrLin, Pos(0) - 1, 0
      Print " ";
      Locate CsrLin, Pos(0) - 1, 1
  End If
End Sub

Sub Display.Status.Line (Var, Var$)
  ' hopefully this is 80x25
  Var2 = _Height
  Var3 = _Width
  If Var Then
      Color 14, 1 ' hilight
  Else
      Color 15, 0 ' clear
  End If
  Locate Var2, 1, 0
  VarZ$ = Var$ + Space$(Var3 - Len(Var$))
  Print VarZ$;
  Locate Var2 - 1, 1, 1
  Color 15, 0
End Sub

LOC: 165


Attached Files
.bas   random3.bas (Size: 3.71 KB / Downloads: 80)
Reply
#2
Its very similar to shuffling a deck of cards which can be done in way less LOC!

In fact for range bottom to top for integers say 50 to 500, you want n amount random inetgers, say 100.

BRB!
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#3
Code: (Select All)
top = 500
bottom = 50
n = 100
Randomize Timer

Print n; " random integers between:"; bottom; " and"; top

'create deck
Dim deck(bottom To top)
For i = bottom To top
    deck(i) = i
Next
'shuffle it
For i = top To bottom + 1 Step -1
    Swap deck(Int(Rnd * (i - bottom + 1)) + bottom), deck(i)
Next
'report
For i = 1 To n
    Print deck(i + bottom);
Next


I had to run it with this code to debug it to make sure top and bottom numbers were included:
Code: (Select All)
top = 60
bottom = 50
n = 10
Randomize Timer

Print n; " random integers between:"; bottom; " and"; top

'create deck
Dim deck(bottom To top)
For i = bottom To top
    deck(i) = i
Next
'shuffle it
For i = top To bottom + 1 Step -1
    Swap deck(Int(Rnd * (i - bottom + 1)) + bottom), deck(i)
Next
'report
For i = 1 To n
    Print deck(i + bottom);
Next

So +1 to eric for my morning QB64 quiz!
Guess I was bored too Smile
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#4
Ah, Heck! That is way easier then what I am doing:
  (shuffle a deck of cards)..

You just helped me dwindle my code into 4 lines. Wink

Code: (Select All)
Input n: Dim e(n)
For i = 1 To n: e(i) = i: Next
For i = 1 To n: Swap e(Int(Rnd * n + 1)), e(Int(Rnd * n + 1)): Next
For i = 1 To n: Print e(i);: Next
Reply
#5
While we are still on-topic, here is a card shuffle program:

Code: (Select All)
Rem program randomizes and displays a shuffled deck of cards.
Color 12
Print "Shuffle a deck of cards:"
n = 52: Dim e(n)
Randomize Timer
For i = 1 To n: e(i) = i: Next
For i = 1 To n: Swap e(Int(Rnd * n + 1)), e(Int(Rnd * n + 1)): Next
For i = 1 To 52
  Color 15
  Select Case e(i)
      Case 1 To 13
        q = e(i): GoSub DisplayCard
        Print "Clubs"
      Case 14 To 24
        q = e(i) - 13: GoSub DisplayCard
        Print "Hearts"
      Case 25 To 37
        q = e(i) - 24: GoSub DisplayCard
        Print "Diamonds"
      Case 38 To 52
        q = e(i) - 37: GoSub DisplayCard
        Print "Spades"
  End Select
  If (i Mod 13) = 0 Then
      Color 14
      Print "-more-";
      Do
        _Limit 50
        If Len(InKey$) Then Print: Exit Do
      Loop
  End If
Next
Color 7
End
DisplayCard:
Select Case q
  Case 1
      Print "Ace";
  Case 11
      Print "Jack";
  Case 12
      Print "Queen";
  Case 13
      Print "King";
  Case Else
      Print q;
End Select
Print " of ";
Return


Attached Files
.bas   shuffle.bas (Size: 1.05 KB / Downloads: 81)
Reply
#6
Similar topic: Guess My Number

https://qb64phoenix.com/forum/showthread...900&page=2

Today still better

And from 2020: see you?

https://qb64forum.alephc.xyz/index.php?topic=4473.15
Write name of program in 1st line to copy & paste & save filename.bas
Insert program pictures: press print-screen-shot button
Open paint & Paste & Save as PNG
Add picture file to program topic

Russia looks world from future. Big data is peace data.
I never recommend anything & always write only about myself
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Springs2 (random graphic art) mstasak 4 519 11-13-2025, 12:44 PM
Last Post: Dav
  Simple text pixel data to array demo Unseen Machine 5 630 09-12-2025, 05:30 PM
Last Post: bplus
  Getting a random number wihout RND. Dav 25 7,326 06-03-2025, 08:35 PM
Last Post: madscijr
  Random Object Wandering TerryRitchie 1 718 09-29-2024, 03:38 PM
Last Post: TerryRitchie
  Funny Random Sentence Generator SierraKen 5 3,473 09-12-2024, 05:57 PM
Last Post: DANILIN

Forum Jump:


Users browsing this thread: