Page 1 of 1
Random number pickup
Posted: Tue Aug 02, 2005 11:36 am
by bidanh00co
I want to make a small apps that can pick a random number. For i.e, there are 80 people in a class. We want to divide them in to 8 group randomly. I can do like this (I post the simplest code)
NumberOfPeople=80
NumberOfGroup=8
Dim Index(NumberOfPeople)
file=CreateFile(0, "c:\list.txt")
If file
For i=1 to NumberOfPeople
Index(i) = Random(NumberOfPeople)
If Index(i) <> 0
WriteStringN(Str(Index(i)))
EndIf
Next i
CloseFile(0)
-----------
Everything seems simple, but the matter is some generated number will be duplicated to triplicated.
I don't know how to avoid this. It mean how to Random a value but not the same generated value.
Reality, as you see, the task is divide into NumberOfGroup. So, it will be wrong if there are 2 or more same number in many group.
Extensively, I want to link this thing to Database. Despite generate number, it will generate Name of the People.
Would you please help me or give me a way ? It's great if you help me with Database link.
Posted: Tue Aug 02, 2005 12:51 pm
by Splondike
As I understand it, you're looking to randomise the order of the numbers 1 to 80 (using your example). Eg. Using the numbers 1 to 4:
What you're getting:
3 3 1 2
What you want:
4 1 3 2
Here's a bit of code which should help you -i'm not going to worry about writing to a file, just assigning an array-:
Code: Select all
NumberOfPeople = 80
Dim Index(NumberOfPeople - 1) ;Remember, arrays start at 0, so array will go from 0 to 79
For i = 1 to NumberOfPeople
r = Random(NumberOfPeople) ;Assign r a value between 0 and 79
If Index(r) = 0 ;Default value, unassigned array element
Index(r) = i
Else
i = i - 1 ;Keep the value of i the same in the for loop; we picked an array element which was previously assigned
EndIf
Next i
You'll need to change the above code a bit (obviously

), it mightent work as is, it was just hacked up to give you the idea.
Regarding the database, can't help you unfortunately, i'm new at this thing myself

.
Posted: Wed Aug 03, 2005 9:59 am
by bidanh00co
oh Splondike, it doesn't work exactly what I need. Did you test your code ??

Posted: Wed Aug 03, 2005 10:42 pm
by ravagepn
Really it doesn't work, but I got the point of what he meant to do. Also, check this topic about linkedlists. It may help you:
viewtopic.php?t=16135
Posted: Thu Aug 04, 2005 4:17 am
by bidanh00co
Thank you !
But Is there any way to re-order Linkedlist randomly ?
Example: you have a list contains numbers from 1 to 80
Is there a way to random (or re-order that numbers Randomly: 45,25,68,11,12,1,3,6,79,1,5,9,90,15.....
Posted: Thu Aug 04, 2005 4:49 am
by Fou-Lu
I think this might work:
Code: Select all
Dim people(80)
for n=0 to 80
people(n)=n ;first we create an ordered list
next n
;now we make a mess!!!
for n=0 to 80
m=random(80)
temp=people(m)
people(m)=people(n)
people(n)=temp
next n
Got it?

Posted: Thu Aug 04, 2005 8:57 am
by Dare2
Here is one way
Code: Select all
Structure grpDef
names.s
ctr.l
EndStructure
NumPeeps = 82 ; Total People
SzGrps = 4 ; People per group
NewList allPeeps.s() ; List of the people to be grouped
NewList fullGrp.grpDef() ; List of teams or groups
For i=1 To NumPeeps ; Populate our people list somehow
AddElement(allPeeps()) ; Here we just use numbers
allPeeps()="Name_"+Str(i)
Next
ResetList(allPeeps())
AddElement(fullGrp()) ; Create the first group
While CountList(allPeeps())<>0
g=Random(CountList(allPeeps())+1) ; Get a random number 0 to remaining people+1
For i=0 To g ; Advance through the working group
NextElement(allPeeps()) ; by random number of places.
If ListIndex(allPeeps())=CountList(allPeeps())-1
ResetList(allPeeps()) ; If we reach the end of the list,
NextElement(allPeeps()) ; wrap around
EndIf
Next
fullGrp()\ctr+1 ; Up the count of people in the group
fullGrp()\names+allPeeps()+" " ; Add the name of the person
allPeeps()="" ; <<-- Just in case of string leakage
DeleteElement(allPeeps()) ; Remove the person from the people list
If fullGrp()\ctr=SzGrps ; Is the group full?
AddElement(fullGrp()) ; If so, start a new group
EndIf
Wend
FirstElement(fullGrp())
Repeat
If fullGrp()\ctr<>SzGrps
Debug Str(fullGrp()\ctr)+": "+fullGrp()\names+" ***************"
Else
Debug Str(fullGrp()\ctr)+": "+fullGrp()\names
EndIf
fullGrp()\names=""
DeleteElement(fullGrp())
FirstElement(fullGrp())
Until CountList(fullGrp())=0
Posted: Thu Aug 04, 2005 5:22 pm
by ravagepn
Here are two ways, #1 with linkedlists:
Code: Select all
NewList mylist.l()
NewList exitlist.l()
pocetak:
ClearList(mylist())
ClearList(exitlist())
For i = 0 To 80
AddElement(mylist())
mylist() = i
Next
For i = 1 To 80
brj = Random(79) + 1
SelectElement(mylist(), brj)
vst = mylist()
DeleteElement(mylist())
AddElement(exitlist())
exitlist() = vst
Next
OpenConsole()
ResetList(exitlist())
While NextElement(exitlist())
Print(Str(exitlist()) + " ")
Wend
PrintN("")
PrintN("")
ResetList(mylist())
While NextElement(mylist())
Print(Str(mylist()) + " ")
Wend
While Inkey() = ""
Wend
ClearConsole()
Goto pocetak
CloseConsole()
End
Way #2 with arrays:
Code: Select all
Dim a(80)
For i = 1 To 80
a(i) = Random(79) + 1
For j = 1 To i
While a(i) = a(j) And i <> j
a(i) = Random(79) + 1
Wend
Next
Next
OpenConsole()
For i = 1 To 80
Print(Str(a(i)) + " ")
Next
PrintN("")
PrintN("")
PrintN("Press any key")
While Inkey() = ""
Wend
CloseConsole()
When you want to re-random list (or array) use goto or procedure commands. Also you can copy list into an array. Something like this :
Code: Select all
Dim broj.l(7)
p = 0
ResetList(exitlist())
While NextElement(exitlist())
broj(p+1) = exitlist()
p = p + 1
Wend
I hope I helped a little bit
Posted: Thu Aug 04, 2005 11:16 pm
by dmoc
Shuffle? To do it you need to remove each number from the selection list as it comes up. May be that's what the examples do above (I'm laZy so I haven't scrutinized the code)
Posted: Fri Aug 05, 2005 3:51 am
by bidanh00co
Thank you for all of you ! it' very nice
Furthermore, If it can link to an Excel File (which contains list of people Full Name and their index number), it would be great !!
Posted: Fri Aug 05, 2005 7:55 am
by dmoc
Oh Excel... may be there is an add-in to randomise a list? I've checked Excels (97) random and sampling but they won't do what you want. Google!