Skocz do zawartości
dazon

Losowanie Liczb Randomem Bez Powtórzeń

Rekomendowane odpowiedzi

Witam wszystkich programistów..

 

 

Możecie mi wierzyć bądź nie ale pałuje się już z tym 2 dni i pomimo wiekich chęci jużnie daje sobie rady.

 

Chodzi mi o napisanie kodu który bedzie losował liczbe z jakiegos zakresu np: do tablicy 10 wymiarowej.

 

Kolejne wylosowane liczby nie mogą się powtórzyć..

 

Nie chodzi mi o jakąś specjalnąfunkcję ani ekod obiektowy.. Chodzi o najprostrze rozwiązanie.

 

Jest to niezbedny fragment kodu który jest mi potrzebny do pozostałej czesci programu. Bez niego nei rusze dalej :(

 

 

oto kod tego co udalo mi sie do tej pory zrpobic niestety nie działający :(

Nie ma pomysłu :(

 

while (v!=powtorzenia_m[0]);

{

cout<<"test";

 

 

losowanie=(int)(1+rand()%12);

ta[0]=losowanie;

cout<<"wylosowano :"<<losowanie;

 

 

losowanie=(int)(1+rand()%12);

 

for ( ii=1;ii<v;ii++)

{

if(losowanie==ta[ii])

{

 

while (losowanie!=ta[ii])

{

losowanie=(int)(1+rand()%12);

}

ta[ii]=losowanie;

}

else

ta[ii]=losowanie;

 

}

Witam wszystkich programistów..

Możecie mi wierzyć bądź nie ale pałuje się już z tym 2 dni i pomimo wiekich chęci jużnie daje sobie rady.

 

Chodzi mi o napisanie kodu który bedzie losował liczbe z jakiegos zakresu np: do tablicy 10 wymiarowej.

 

Kolejne wylosowane liczby nie mogą się powtórzyć..

 

Nie chodzi mi o jakąś specjalnąfunkcję ani ekod obiektowy.. Chodzi o najprostrze rozwiązanie.

 

Jest to niezbedny fragment kodu który jest mi potrzebny do pozostałej czesci programu. Bez niego nei rusze dalej :(

oto kod tego co udalo mi sie do tej pory zrpobic niestety nie działający :(

Nie ma pomysłu :(

 

Przed chwilka napisałem cos takiego DLACZEGO TO TEZ NIE DZIAŁA I LICZBY SIE POWTARZAJĄ ?????????????????????????????

 

#include <vcl.h>#pragma hdrstop#pragma argsused#include <fstream.h>#include <iostream.h>#include <vector.h>#include<stdlib.h>#include<math.h>#include<time.h>//------------------------------int tablica[10];int i;int losowa_liczba;time_t random_generator;int main(){srand( time( &random_generator ) );  for(int i=0;i<10;i++)   {	 losowa_liczba = rand()%11;	 tablica[i]=losowa_liczba;   }  for(i=0;i<10;i++)   {   cout<<tablica[i]<<endl;   }getchar();}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Liczby się powtarzają bo nie dodałeś żadnej procedury sprawdzającej czy dana liczba już została wylosowana (drugi kod). Najprostszy sposób to stworzenie pomocniczej tablicy zero-jedynkowej. Jej indeks to wylosowana liczba, a "1" pod danym indeksem to znak, że dana liczba została wylosowana. Oczywiście to rozwiązanie ma pewną okrutną wadę - bardzo ograniczony zakres losowanych liczb. Drugą poważną wadą jest to, że losowane liczby mogą być tylko liczbami całkowitymi, po pewnym przekształceniu na indeksach tablicy pomocniczej ofkors.

 

Jak znajdę chwilkę wolnego czasu to napiszę coś bardziej użytecznego.

 

 

EDIT:

 

Na szybkiego. Mogą być błędy :P

 

#pragma argsused#pragma hdrstop#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<time.h>int tab[10];int i, k;time_t random_generator;int main() {tab[0] = rand()%15;for(k = 1; k < 10; k++) { tab[k] = rand()%15; for(i = k - 1; i >= 0; i--)   if(tab[k]==tab[i]) tab[k] = rand()%15;}for(k = 0; k < 10; k++) printf("%d %d\n", k, tab[k]);getch();return 0;}

Kod sprawdzony przed chwilą i działa jak należy.

Edytowane przez Dj_AnT

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chyba jużmi sie udało . Póki co jak testowałem to działało Oto kod który mam nadzieje przyda się tym którzy kiedys bedą mieli taki problem jak ja teraz miałem:)

 

#include <vcl.h>#pragma hdrstop#pragma argsused#include <fstream.h>#include <iostream.h>#include <vector.h>#include<stdlib.h>#include<math.h>#include<time.h>//------------------------------int tablica[10];int i;int losowa_liczba; int main(){time_t random_generator;srand( time( &random_generator ) );  for(int i=0;i<10;i++)   {	 losowa_liczba = rand()%11;	  tablica[i]=losowa_liczba;	 for(int k=0;k<i;k++)	  {		if(losowa_liczba == tablica[k])		  {			i--;		  }	  }   }  for(i=0;i<10;i++)   {   cout<<tablica[i]<<endl;   }getchar();}

Pozdrawiam

Edytowane przez dazon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak z ciekawości sprawdziłem Twój kod. Chciałem zobaczyć czy jest szybszy od mojego. Zadeklarowałem tablicę o rozmiarze 100000 i zakresie losowania od 0 do 30000000. Program wypełnił 32769 komórek i się zapętlił. Gdzieś tkwi haczyk ale jest zbyt późna pora żebym go znalazł.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak z ciekawości sprawdziłem Twój kod. Chciałem zobaczyć czy jest szybszy od mojego. Zadeklarowałem tablicę o rozmiarze 100000 i zakresie losowania od 0 do 30000000. Program wypełnił 32769 komórek i się zapętlił. Gdzieś tkwi haczyk ale jest zbyt późna pora żebym go znalazł.

 

Hmm Chyba nie bede potrzebował az tak duzych wartosci:)

 

Ale jeśli znajdziesz chwilke to bede wdzieczny jesli znajdziesz ten haczyk.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po części można powiedzieć, że faktycznie ilość bitów na jakie składa się int zależy od kompilatora, a dokładnie zależy od implementacji samego języka, z którą kompilator jest zgodny.

Ogólnie w standardzie przyjęte jest, że int ma mieć co najmniej 16 bitów, ale prawda jest taka, że w dzisiejszych czasach int = long int = 32 bity i praktycznie wszystkie kompilatory trzymają się tej reguły.

Edytowane przez argaven

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam szanownych forumowiczów, muszę właśnie napisać w c# podobny program. wylosowane liczby nie mogą się powtarzać ii do wypełnienia jest tablica dwuwymiarowa. Macie jakieś sugestie jak się do tego zabrać. Z góry dziękuję.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

gorzej jak ma wypełnić tablicę np 10x10 liczbami z przedziału jakiegoś zawierająego 100 liczb... Wtedy im bliżej końca tym losowanie będzie powtarzane więcej razy.. w skrajnym przypadku może liczyć i liczyć :D Wtedy trzeba by zastosować inny algorytm...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A to od kiedy ?

Od wtedy, tak mnie uczyli na uczelni, i widac nie pomylili sie .

W zależności od kompilatora dane typu int zajmują 2 lub 4 bajty, czyli 16 lub 32 bity. A więc mogą przyjmować 2^16=65536 lub 2^32=4294967296 różnych wartości. Jest przyjęte że typ int nie może zajmować więcej bajtów niż long i mniej niż short, a więc klasyfikuje się w przedziale:

short<=int<=long

zrodlo np : http://4programmers.net/C/Int

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

 

Losuje liczby od 1 do 100 bez powtórzeń

#include <cstdlib>#include <iostream>#include <string>#include <time.h>using namespace std;int i, ii, i3, i4;int l=0;int r=0;int tab[99];int main(int argc, char *argv[]){   srand((unsigned)time(0));   tab[0] = (rand()%100)+1;   for(i3=1;i3<100;i3++){   tab[i3] = 0;}//    cout<<" i przed for = "<<i<<endl;//    cout<<" l przed for = "<<l<<endl;   for(i=1;i<100;i++){///1   tab[i] = (rand()%100)+1;   l=0;//    cout<<" i w for = "<<i<<endl;//    cout<<" l w for = "<<l<<endl;   while(l<i){//    cout<<" i w while = "<<i<<endl;//    cout<<" l w while = "<<l<<endl;   i4=i;   if(tab[l]==tab[i4]){//    cout<<" i w if = "<<i<<endl;//    cout<<" l w if = "<<l<<endl;   i--;}   l++;}     }///1      cout<<"wynik = ";   while(r<100){      cout<<" "<<tab[r];    r++;}      cout<<endl;}/// main
Edytowane przez zdanc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Twój kod jest rekordowo nieczytelny. Nie zawiera odstępów ani wcięć, zwodniczo ustawia klamry. Jest w niezdrowym stopniu pascalowaty. Używa post- tam, gdzie efektywniej jest użyć preinkrementacji. Niepotrzebnie trzyma liczniki pętli - w dodatku globalne. Ponadto wychodzi poza zakres tab[99]. To tablica 99 elementów z indeksami od 0 do 98.

 

Pytanie zadano przed czterema laty, tym niemniej przypuszczam, że można tutaj trafić przez wyniki wyszukiwania Google. Moja nieskomplikowana propozycja poniżej. Losuje od 0 do range - 1. Zmiana zakresu na jakikolwiek inny nie stanowi kłopotu.

 

#include <iostream>#include <ctime>#include <cstring>#include <cstdlib>int main () {    unsigned range;    std::cout << "Zakres generacji: ";    std::cin >> range;    bool used[range];    memset(used, 0, range);    srand(time(NULL));    int hit;    for (unsigned i = 0; i < /* Liczba potrzebnych losowań */; ++i) {        while (used[hit = rand() % range]);        used[hit] = true; // hit++ pozwoli na losowanie od 1 do range        // Wpisanie wylosowanej liczby gdziekolwiek jest potrzebna    }}
Edytowane przez Vennor

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...