[C]Losowanie dużej ilości liczb bez powtórzeń

0

Witam,
program przy małej liczbie losowań działa ok, przy większej pada. konkretniej dla więcej niż 5 losowań losuje i wiesza, dla więcej niż 15 już nawet nie losuje

#include    <stdio.h>
#include    <stdlib.h>

int* losuj(int a, int b)
{
    int i,j,temp,blad;
    int* tab=(int*)malloc(sizeof(tab));
    
    for (i=0; i<b; i++)
    {
        do
        {
            blad=0;
            temp=rand()%a+1;
            for (j=0; j<i; j++)
                if (tab[j]==temp)
                    blad=1;
        } 
        while (blad);
        tab[ i ]=temp;
    }
    return tab; 
}
int compare(const void *a, const void *b)
{
    return ( *(int*)a - *(int*)b );
}

int main(int argc, char** argv)
{
    int i;
    int *tab;
    srand(time(0));
    
    tab=losuj(atoi(argv[1]),atoi(argv[2]));       
    qsort(tab,atoi(argv[2]),sizeof(int),compare);    
    for(i=0; i<atoi(argv[2]); i++)
        printf("%d\n",tab[i]);
    free(tab);
        
    return 0;
}
0

int* tab=(int*)malloc(sizeof(tab));
a może
int* tab=(int*)malloc(sizeof(int));

a nawet
int* tab=(int*)malloc(b*sizeof(int));

0

dzięki wielkie ;) taka mała literówka i wszystko się wiesza

0

a musi być większe od b, bo inaczej się nie uda

a tak nie ładniej?

i=0
while i<b
	t[i]=rnd(a) // 
	j=0
	while t[i]!=t[j]
		j++
	if j==i
		i++

jeżeli a jest małe to lepiej potasować tablicę t[0..a-1] taką że t[i]=i
a następnie wybrać z niej t[0..b-1]

rand()%a+1 jest dobre tylko wtedy gdy RAND_MAX%a == 0,
czyli gdy a jest potęgą dwójki

jest prawie dobre gdy a jest małe

rnd(a)    //  a<RAND_MAX
	i=2
	while i<a
		i*=2
	do
		j=rand()%i
	while j>=a
	return j

lub prościej trunc((((double)rand())/RAND_MAX)*a+1)

</b>

1 użytkowników online, w tym zalogowanych: 0, gości: 1