generating random unique numbers

a125 a125 at fateback.com
Mon Oct 26 10:58:13 EET 2009


Aravanis Konstantinos wrote:

> 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;
> }
>
>
>


#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