C - random_array – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C - random_array – C / C++ – Fórum – Programujte.comC - random_array – C / C++ – Fórum – Programujte.com

 

olgo
~ Anonymní uživatel
471 příspěvků
2. 6. 2007   #1
-
0
-

zdar. nikde som nenasiel finkciu na vyplnenie pola nahodnymi originalnymi cislami z daneho intervalu. napisal som nieco taketo:



int rand_array(unsigned char *array,int down, int up){
int a, pos, size;

size=up-down;

srand((unsigned) time(NULL) + size + down);

for(a=down;a<=up;a++){
*(array+a)=up+1;
}
for(a=down;a<=up;a++){
pos=rand() % size;
while(*(array+pos)!=up+1){
pos++;
if(pos==size+1){
pos=down;
}
}
*(array+pos)=a;
/*printf("%4d-%4d\n", pos, a);*/
}
return 0;
}


a teda



random_array(pole,0,5);
zmeni hodnoty v poli pole napriklad na 2,4,1,0,3,5

Ale zaujimalo by ma ci neico take nieje v standardnych knizniciach neni alebo ci sa to neda vyriesit nejako efektyvnejsie. dik

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
3. 6. 2007   #2
-
0
-

To olgo: Tu funkci máš definovanou pěkně ale řekl bych že zbytečně dlouhou (taky se mi zdá že tam špatně generuješ hodnotu v rozsahu daného intervalu). Podle mě by to stačilo takhle:



void generuj(int *arr, int max, int dolni, int horni)
{
int i;

srand(time(0));
for (i = 0; i < max; i++)
arr[i] = dolni + rand() % (horni - dolni + 1);
}

Nahlásit jako SPAM
IP: ...–
olgo
~ Anonymní uživatel
471 příspěvků
3. 6. 2007   #3
-
0
-

To Matrix17: povodne som ju mal nejak podobne ale nemoze sa stat ze ked mas vecsie pole a vsetky prvky okrem jedneho uz budu mat priradenu hodnotu a tvoja funkcia sa bude "triafat" do toho posledneho prvku, co moze trvat docela dlho a tym dlhsie cim je pole vecsie?

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
3. 6. 2007   #4
-
0
-

To olgo: To bych teda neřek. Navíc i kdyby to pole bylo hodně velký tak to nezabere víc než pár vteřin. Jen vygeneruješ hodnotu a přiřadíš a to tak hroznou dobu nezabere. Naopak tobě by se mohlo stát že když buideš mít pole třeba arr[5] a jako dolní mez dosta neš 6 tak to spadne s chybou.

Nahlásit jako SPAM
IP: ...–
olgo
~ Anonymní uživatel
471 příspěvků
3. 6. 2007   #5
-
0
-

To Matrix17: rozhodne som nechcel aby sme si tu vzajomne osocevali svoje funkcie. mas pravdu mal som tam chybicku. vyzera to takto:

int rand_array(int *array,int down, int up){

int a, pos, size;

size=up-down+1;
srand((unsigned) time(NULL) + size + down);

for(a=0;a<=size;a++){
*(array+a)=up+1;
}
for(a=down;a<=up;a++){
pos=rand() % size;
while(*(array+pos)!=up+1){
pos++;
if(pos==size+1){
pos=down;
}
}
*(array+pos)=a+down;
printf("%4d-%4d\n", pos, *(array+pos));
}
return 0;
}


tak aby som nevizeral ako blbec a zaroven teba nezhadzoval dovolim si malu analizu: vsetky cisla maju byt originalne a zaroven vyplnat celi interval od down do up, co sa stojej funkcii moc nedari. prave preto prechadzam pole z cislami pomocov


for(a=down;a<=up;a++){
cim je zarucene splnenie podmienky o originalite cisel a pokrytie vsetkych cisel v intervale (ovsem za predpokladu ze sa do pola zmestia) a nahodne generujem indexi


pos=rand() % size; /* uznavam ze nazov pos pre index moze byt zavadzajuci*/
ktore potom, ked uz je na dani index dosadene "nahodne cislo" posuvam dookola


while(*(array+pos)!=up+1){
pos++;
if(pos==size+1){
pos=down;
}
po celom poli, az dokym nanajdem volny prvok a az tam toto nahodne cislo vlozim


*(array+pos)=a+down;
aby som predisiel viacnasobnemu prepisovaniu.

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
3. 6. 2007   #6
-
0
-

Tak to jo já myslel že chceš vygenerovat celý pole a ne "jen" úsek. Aspoň že sme se domluvili. Jinak ještě tam hodím úpravu:



void generuj(int *arr, int dolni, int horni)
{
int i;

if (dolni >= horni)
return;
srand(time(0));
for (i = 0; i < MAX; i++)
arr[i] = dolni + rand() % (horni - dolni + 1);
}

Nahlásit jako SPAM
IP: ...–
olgo
~ Anonymní uživatel
471 příspěvků
3. 6. 2007   #7
-
0
-

Aspoň že sme se domluvili.

tak to asi nie. vysvetlim to radsej na konkretnom priklade. programujem kartovu hru a chcem tymto sposobom miesat karty(kariet je v balicku 52 su tam vsetky a ziadna sa neopakuje). balicek kariet reprezentuje pole[52]. po zamiesani je kariet stale 52 stale sa ziadna neopakuje a stale su vsetky. takze pre konkretky pripad: vysledkom je pole v ktorom su vsetky cisla od down po up a su vzajomne premiesane. races to cele okomentujem.


int rand_array(int *array,int down, int up){
int a;
/* premena zneuzivana na prechadzanie polami (iterator)*/
int pos; /* nahodne generovani index do pola s kartami*/
int size; /* velkost intervalu */

size=up-down+1;
/* ziskanie poctu prvkov (kariet) v idealnom pripade zhodne s velkostou pola */
srand((unsigned) time(NULL) + size + down);

for(a=0;a<=size;a++){

/* pole vyplnim prefixom up+1 (53) aby som videl kam som este cislo nepriradil [devysvetlene neskor] */
*(array+a)=up+1;
}
for(a=down;a<=up;a++){
/* prechadzanie celeho intervalu cim je zabezpecene obsiahnutie celeho intervalu */
pos=rand() % size;
/* vygenerovanie nahodneho indexu pola kam bude cislo a vlozene */
while(*(array+pos)!=up+1){
/* ked je na pozicii pos uz nieco vlozene (nieje tam up+1 (53)) */
pos++;
/* tak postupim na nasledujuci prvok v nadeji ze je este prazdny (53) a skusim vlozit tam ak nie tak na dalsi . . . */
if(pos==size+1){
/* ked som prisiel na koniec pola skocim na zaciatok */
pos=down;
}
}
*(array+pos)=a+down;

/* a na volne (53) miesto vlozim "nahodne" cislo a */
printf("%4d-%4d\n", pos, *(array+pos));
}
return 0;
}



skus to skompilovat vypisuje to vysledky takze sa snad pochopime . . .

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
3. 6. 2007   #8
-
0
-

JJ, už ti rozumím ale mám jednu otázku kolik prvků má ten "balík karet" 52 nebo 53? Jestli má jen 52 (pokud je up 52.) tak by bylo lepší tam hodit:



for(a=down;a<up;a++)

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
3. 6. 2007   #9
-
0
-

To Matrix17: kariet je 52.funkcia generuje od down po up vratane takze up je 51



rand_array(pole,0,51);

generuje pole o dlzke 52 znakov v rozsaku 0-51

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
ok
~ Anonymní uživatel
6 příspěvků
4. 6. 2007   #10
-
0
-

Co se inspirovat treba existujicimi algoritmy pro michani hodnot? http://en.wikipedia.org/wiki/Shuffling_playing_cards (Shuffling algorithms)

Nahlásit jako SPAM
IP: ...–
olgo0
Věrný člen
4. 6. 2007   #11
-
0
-

To ok: v cecku este len zacinam islo mi ale o funkciu opisanu na zaciatku.

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 52 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý