generating random unique numbers

a125 a125 at fateback.com
Mon Oct 26 10:54:57 EET 2009


Haris Alatas wrote:

>Christos Bacharakis wrote:
>  
>
>>Γιώργο, Γιάννη, Κώστα σας ευχαριστώ πάρα πολύ!
>>
>>Κώστα, το θέμα όμως είναι ότι θέλω μοναδικούς αριθμούς, όχι απλά τυχαίους!
>>
>>
>>    
>>
>Λυπάμαι που θα σε απογοητεύσω  αλλά δεν υπάρχουν τυχαίοι αριθμοί στους
>υπολογιστές. Για την ιστορία, η αριθμοσειρά της C++ επαναλαμβάνεται κάθε
>2^15 φορές (με μία επιφύλαξη). Αν ψάξεις στο internet είμαι σίγουρος ότι
>θα βρείς καλύτερες γεννήτριες που έχουν πολυ πολύ μεγαλύτερη
>περιοδικότητα. Τέλοσπάντων μπορείς να την "απογειώσεις" ελαφρώς
>αρχικοποιώντας την με τον χρόνο αλλά ίσως και πάλι διαπιστώσεις επαναλήψεις.
>Αν ενδιαφέρεσαι υπάρχουν κάποια ακαδημαϊκά sites που παρέχουν υπηρεσίες
>για παραγωγή πραγματικά τυχαίων αριθμών αλλά νομίζω ότι ειναι επι πληρωμή.
>
>
>Χάρης
>
>  
>
#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 έχουν μοναδικά στοιχεία ...
δεν τόχω δοκιμάσει, αλλά είναι μια σκέψη ...
}







More information about the Linux-greek-users mailing list