generating random unique numbers

Athanasios Kostopoulos athanasioskostopoulos at gmail.com
Mon Oct 26 11:09:34 EET 2009


Αν μιλαμε για μια ασκηση (ή απλα κατι που δεν απαιτει κρυπτογραφικο PRNG),
και δεν σου αρκει η srand() τοτε ο Mersenne Twister θα σου φανει χρησιμος

http://en.wikipedia.org/wiki/Mersenne_twister

2009/10/26 a125 <a125 at fateback.com>

> Christos Bacharakis wrote:
>
>  2009/10/26 Christos Bacharakis <cmpahar at gmail.com>
>>
>>
>>
>>> 2009/10/26 Aravanis Konstantinos <kos.arav at gmail.com>
>>>
>>> Giorgos Keramidas wrote:
>>>
>>>
>>>> On Mon, 26 Oct 2009 02:17:29 +0200, Christos Bacharakis <
>>>>> cmpahar at gmail.com> wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> Καλησπέρα!
>>>>>>
>>>>>> Θα ήθελα την προγραμματιστική βοήθεια σας.
>>>>>>
>>>>>> Θέλω να δημιουργήσω 7 τυχαίους αριθμούς οι οποίοι θα έχουν τιμές από 1
>>>>>> έως 7. Ο λόγος που θέλω να το κάνω αυτό είναι για να αλλάζει σε κάθε
>>>>>> εκτέλεση η σειρά των αριθμών. Η γλώσσα που υλοποιώ το πρόγραμμα είναι
>>>>>> C++.
>>>>>>
>>>>>> Μια δικιά μου προσέγγιση η οποία όμως σε κάθε εκτέλεση μου βγάζει τα
>>>>>> ίδια αποτελέσματα!!!
>>>>>>
>>>>>> for(i=0; i<8; i++){
>>>>>> pin[i]=i;
>>>>>> }
>>>>>>
>>>>>> for(i=0; i<8; i++){
>>>>>> j=rand() % 7;
>>>>>> k=rand() % 7;
>>>>>> swap(pin[j],pin[k]);
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>> ... αν θέλεις να παράγεις διαφορετικούς αριθμούς σε κάθε τρέξιμο,
>>>>> ίσως χρειαστεί να δώσεις στην srand() ένα πιο «τυχαίο» seed value...
>>>>>
>>>>>
>>>>>
>>>> πχ.
>>>>
>>>> #include <stdio.h>
>>>> #include <stdlib.h>
>>>>
>>>> int main(void)
>>>> {
>>>>     int i, pin[8];
>>>>     srand(time(0));
>>>>
>>>>
>>>>     for(i=0; i<8; i++)
>>>>             pin[i] = rand()%7;
>>>> }
>>>>
>>>>
>>>>
>>>> --
>>>> Aravanis Kostas
>>>> My web page: www.AravanisKostas.com <www.aravaniskostas.com>
>>>> An easy way to learn Python: www.TasPython.eu
>>>>
>>>> Γιώργο, Γιάννη, Κώστα σας ευχαριστώ πάρα πολύ!
>>>>
>>>>
>>> Κώστα, το θέμα όμως είναι ότι θέλω μοναδικούς αριθμούς, όχι απλά
>>> τυχαίους!
>>>
>>> --
>>> Christos Bacharakis
>>> cmpahar at gmail.com
>>> http://bacharakis.com
>>>
>>>
>>>
>>>
>> thanks και πάλι σε όλους. Το έκανα με srand() και δουλεύει τέλεια! :)
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>>
>
>
> #include<map.h>
> #include <time.h>
>
> //use this first function to seed the random number generator,
> //call this before any of the other functions
> void initrand()
> {
>       srand((unsigned)(time(0)));
> }
>
> //generates a psuedo-random integer between 0 and 32767
> int randint()
> {
>       return rand();
> }
>
> //generates a psuedo-random integer between 0 and max
> int randint(int max)
> {
>       return int(max*rand()/(RAND_MAX+1.0));
> }
>
> //generates a psuedo-random integer between min and max
> int randint(int min, int max)
> {
>       if (min>max) {
>               return max+int((min-max+1)*rand()/(RAND_MAX+1.0));
>       } else {
>               return min+int((max-min+1)*rand()/(RAND_MAX+1.0));
>       }
> }
>
> //generates a psuedo-random float between 0.0 and 0.999...
> float randfloat()
> {
>       return rand()/(float(RAND_MAX)+1);
> }
>
> //generates a psuedo-random float between 0.0 and max
> float randfloat(float max)
> {
>       return randfloat()*max;
> }
>
> //generates a psuedo-random float between min and max
> float randfloat(float min, float max)
> {
>       if (min>max) {
>               return randfloat()*(min-max)+max;
>       } else {
>               return randfloat()*(max-min)+min;
>       }
> }
>
> //generates a psuedo-random double between 0.0 and 0.999...
> double randdouble()
> {
>       return rand()/(double(RAND_MAX)+1);
> }
>
> //generates a psuedo-random double between 0.0 and max
> double randdouble(double max)
> {
>       return randdouble()*max;
> }
>
> //generates a psuedo-random double between min and max
> double randdouble(double min, double max)
> {
>       if (min>max) {
>               return randdouble()*(min-max)+max;
>       } else {
>               return randdouble()*(max-min)+min;
>       }
> }
>
>
> int main(void)
> {
>       initrand();
> // τώρα αρχίζεις να παράγεις αριθμούς που σε ενδιαφέρουν βάζοντάς τους σε
> μια λίστα μοναδιαίων
> // δηλαδή θα χρειαστεί από STL ...
> http://www.cplusplus.com/reference/stl/map/
>
> map<pair(int,int)> amap;
> int i=0;
> while(i<10){
> int k= .... η συνάρτηση που θα διαλέξεις ...
> amap.push_back(pair(i,k));
> i=amap.size(); // αυτό σημαίνει ότι αν έχει μεγαλώσει το amap θα αυξηθεί ο
> δείκτης i
> // και για να γίνει αυτό πρέπει το ζευγάρι i,k να μην υπάρχει.
> μπορείς να το κάνεις και χωρίς ζευγάρι
> τα map έχουν μοναδικά στοιχεία ...
> δεν τόχω δοκιμάσει, αλλά είναι μια σκέψη ...
> }
>
>
>
>
>
>
>
> --
> linux-greek-users mailing list -- http://lists.hellug.gr
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.hellug.gr/pipermail/linux-greek-users/attachments/20091026/1e26bca0/attachment.htm>


More information about the Linux-greek-users mailing list