dazon Opublikowano 26 Kwietnia 2007 Zgłoś Opublikowano 26 Kwietnia 2007 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();} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 26 Kwietnia 2007 Zgłoś Opublikowano 26 Kwietnia 2007 (edytowane) 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 26 Kwietnia 2007 przez Dj_AnT Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
dazon Opublikowano 26 Kwietnia 2007 Zgłoś Opublikowano 26 Kwietnia 2007 (edytowane) 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 26 Kwietnia 2007 przez dazon Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 27 Kwietnia 2007 Zgłoś Opublikowano 27 Kwietnia 2007 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ł. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
dazon Opublikowano 27 Kwietnia 2007 Zgłoś Opublikowano 27 Kwietnia 2007 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
p3dzi0r Opublikowano 5 Maja 2007 Zgłoś Opublikowano 5 Maja 2007 jak zadeklarowałeś rozmiar tablicy ? bo jezeli przez inta to moze wysypal sie na jego maksymalnej wartosci 32tysiace z hakiem. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
thuGG Opublikowano 6 Maja 2007 Zgłoś Opublikowano 6 Maja 2007 A od kiedy to int ma 32 tysiace z hakiem, przecierz to liczba 32bit (na takich prockach), czyli toche powyzej 4 milardow. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
p3dzi0r Opublikowano 6 Maja 2007 Zgłoś Opublikowano 6 Maja 2007 to ile bit to chyba zalezy od kompilatora ;] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Prog Opublikowano 6 Maja 2007 Zgłoś Opublikowano 6 Maja 2007 to ile bit to chyba zalezy od kompilatora ;] A to od kiedy ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
argaven Opublikowano 6 Maja 2007 Zgłoś Opublikowano 6 Maja 2007 (edytowane) 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 6 Maja 2007 przez argaven Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
zooshe Opublikowano 7 Maja 2007 Zgłoś Opublikowano 7 Maja 2007 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ę. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Linoge Opublikowano 7 Maja 2007 Zgłoś Opublikowano 7 Maja 2007 wylosowac jakas liczbe i sprawdzic potem czy znajduje sie w tablicy ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 9 Maja 2007 Zgłoś Opublikowano 9 Maja 2007 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... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
dazon Opublikowano 9 Maja 2007 Zgłoś Opublikowano 9 Maja 2007 Witam po dłuższej przerwie Widze ze mój temat przydał sie i rozpoczeła sie nawet dyskusja na temat inta :) Fajno Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
p3dzi0r Opublikowano 14 Maja 2007 Zgłoś Opublikowano 14 Maja 2007 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
zdanc Opublikowano 10 Czerwca 2011 Zgłoś Opublikowano 10 Czerwca 2011 (edytowane) 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 10 Czerwca 2011 przez zdanc Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Vennor Opublikowano 10 Czerwca 2011 Zgłoś Opublikowano 10 Czerwca 2011 (edytowane) 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 10 Czerwca 2011 przez Vennor Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...