Forum strony www.multipasko.pl [Regulamin]


Dodaj wpis w tym temacie
Spis tematów
Login:

Hasło:
Strona: 1 2 3 4 ... 18 19
Wyślij wiadomość do admina

Przewiń wpisy ↓

C++ od niechcenia

2018-05-08 (17:42)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 166 859
[ CZCIONKA SPECJALNA ]

Wylosowanie wszystkich kombinacji 2/3/7





//--------------------------

bool tab[8];// Tablica kombinacji 2/3/7



int main()

{



int a,v,x;

v = 0;

x = 0;

UprzypadkowijMT();



do

{

x++;

a = (MersenneTwister() % (7)) +1;

if(tab[a]==0) {v++; tab[a]=1;}

}



while (v < 7);



cout << "Losowano " << x << " razy" << endl << endl;



cout << " Koniec ";



getch();



return 0;

}
2018-05-08 (22:36)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 166 932
[ CZCIONKA SPECJALNA ]

Dziękuję sindbad. Jak widać najlepiej poznawać nowe możliwości programu i się uczyć przerabiania kodów, na samodzielnie wymyślonych przykładach.

Napisałeś cyt.

"Np. 2/3 = 3 a 2/7 = 21 to 2/3/7 = 7 kombinacji i na tyle ustawiamy generator sprawdzając rozkład trafienia 2/3/7.

Czy dobrze rozumiem, ta liczba 7 w przykładzie, wzięła się w wyniku prostej operacji dzielenia 21 przez 3 ?

2018-05-09 (16:34)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 031
[ CZCIONKA SPECJALNA ]

Tak.

W siódemce mamy 21 dwójek.

W trójce mamy 3 dwójki.

System z siedmiu liczb o gwarancji 2/2 na 3 skreślenia to 7 zakładów (21:3).

--- wpis edytowano 2018-05-09 16:35 ---

2018-05-10 (11:02)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 167 132
[ CZCIONKA SPECJALNA ]

sindbad, załóżmy, że jestem "niewierny Tomasz" Czy jest możliwość modyfikacji kodu aby zobaczyć w oknie konsoli wszystkie losowania, które potrzebne były programowi aby wylosować wszystkie 2z3 przy 7 liczbach ? Powiedzmy, że program potrzebował 19 losowań aby zaliczyć wszystkie dwójki, więc oczywiste jest, że niektóre pary w trójkach musiały się powtarzać i ja chciałbym je sobie zobaczyć Da się to zrobic ?

I druga sprawa, kiedy wynik dzielenia nie jest liczbą całkowitą np. dla systemu 2/4/7 --> 21/6 = 3,5 to liczbę bool tab[] należy zaokrąglić, dobrze rozumuję ? Należy zaokrąglić w górę, w dół, czy może trzeba jeszcze jakis inny "myk" aby wyliczyć wszystkie losowania, w których wypadną wszystkie pary ?
2018-05-10 (15:37)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 173
[ CZCIONKA SPECJALNA ]

"Powiedzmy, że program potrzebował 19 losowań aby zaliczyć wszystkie dwójki, więc oczywiste jest, że niektóre pary w trójkach musiały się powtarzać i ja chciałbym je sobie zobaczyć Da się to zrobic ? "



Da się.



Druga sprawa.

Zaokrąglamy w górę.

Jedna uwaga jest taka, że tym sposobem nie zbudujemy systemu.

--- wpis edytowano 2018-05-10 15:46 ---

2018-05-10 (17:31)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 167 184
[ CZCIONKA SPECJALNA ]

>>> tym sposobem nie zbudujemy systemu <<<

Warto jednak wiedzieć, ile par i jaki jest ich rozkład pod wzgledem ilosci wystąpień, w zadaniu polegającym na wypadnięciu wszystkich możliwych do utworzenia z danej ilości liczb par w losowaniach np. trójek. Do celów analityczno-poznawczych taka wiedza może sie przydać.
2018-05-10 (17:50)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 186
[ CZCIONKA SPECJALNA ]

Damy radę.

Teraz idę popracować fizycznie.
2018-05-12 (18:52)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 529
[ CZCIONKA SPECJALNA ]

//--------------------------



bool tab[8];

int para[7][8];



const int zak[8][4]= {0,0,0,0,

0,1,2,3,

0,1,4,5,

0,1,6,7,

0,2,4,6,

0,2,5,7,

0,3,4,7,

0,3,5,6};

int main()

{



int i,j,a,v,x;//

v = 0;

x = 0;

UprzypadkowijMT();

do

{

x++;

a = (MersenneTwister() % (7)) +1;

if(tab[a]==0) { v++; tab[a]=1; }

cout<< zak[a][1]<<","<<zak[a][2]<<","<<zak[a][3]<<endl;

for(i=1;i<=2;i++)

for(j=i+1;j<=3;j++)

para[zak[a][i]][zak[a][j]]++;

}

while (v < 7);

cout << endl<< "Losowano " << x << " razy" << endl << endl;



cout<<"Wylosowane ary:"<<endl<<endl;



for(i=1;i<=6;i++)

for(j=i+1;j<=7;j++)

cout<<i<<","<<j<<" = "<<para[i][j]<<endl;



cout <<endl<<"Koniec ";

getch(); return 0; }

--- wpis edytowano 2018-05-12 18:54 ---

2018-05-12 (19:01)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 530
[ CZCIONKA SPECJALNA ]

2018-05-12 (19:28)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 533
[ CZCIONKA SPECJALNA ]

Ta wersja losuje do momentu gdzie każda para wystąpi 1 raz.



Koszyk = wybranie wszystkich par.



//--------------------------

bool tab[8];

int para[7][8];



const int zak[8][4]= {0,0,0,0,

0,1,2,3,

0,1,4,5,

0,1,6,7,

0,2,4,6,

0,2,5,7,

0,3,4,7,

0,3,5,6};

int main()

{



UprzypadkowijMT();



int i,j,a,v,x,r;

r=0;

do{

r++;

for(i=1;i<=6;i++)

for(j=i+1;j<=7;j++) para[i][j]=0;

for(i=1;i<=7;i++) tab[i]=0;

v = 0;

x = 0;

cout<<endl<<"Koszyk numer "<<r<<endl<<endl;

do

{

x++;

a = (MersenneTwister() % (7)) +1;

if(tab[a]==0) { v++; tab[a]=1; }

cout<< zak[a][1]<<","<<zak[a][2]<<","<<zak[a][3]<<endl;

for(i=1;i<=2;i++)

for(j=i+1;j<=3;j++)

para[zak[a][i]][zak[a][j]]++;

}

while (v < 7);

cout << endl<< "Losowano " << x << " razy" << endl << endl;



cout<<"Wylosowane pary:"<<endl<<endl;



for(i=1;i<=6;i++)

for(j=i+1;j<=7;j++)

cout<<i<<","<<j<<" = "<<para[i][j]<<endl;

}

while(x>7);

cout <<endl<<"Koniec ";

getch(); return 0; }





--- wpis edytowano 2018-05-12 19:34 ---

2018-05-12 (22:08)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 167 559
[ CZCIONKA SPECJALNA ]

Dziękuję sindbad. Otrzymałem więcej niż oczekiwałem Spróbuję już samodzielnie na podstawie Twoich kodów przerobić je pod inne parametry systemu. Jeśli będe miał jakieś kłopoty ( a pewnie będę ) to zwrócę się do Ciebie o pomoc. {[ Pozdrawiam ]}
2018-05-13 (12:42)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 167 644
[ CZCIONKA SPECJALNA ]

Sindbad, domyślam się, że wszystkie pary są losowane z trójek wpisanych do:

const int zak[8][4]. To jest (chyba) pewne ograniczenie losowości, bo gdzie jest powiedziane, że nie może być wylosowana np. trójka 4,5,7 ? Wydaje mi się, że program losując trójki z 7 liczb, powinien mieć "swobodę" wyboru z wszystkich kombiancji 3z7, czyli z 35 zestawów. Próbowałem coś tam pozmieniać w kodzie programu, ale przerosło to moje możliwości A może po prostu tak jak jest teraz jest prawidlowo, więc niepotrzebnie zawracam Ci głowę ? Pozdrawiam!
2018-05-13 (17:55)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 686
[ CZCIONKA SPECJALNA ]

Witaj,



Ta wersja wylosuje system, gdzie każda para wystąpi dokładnie 1 raz.

System matematycznie idealny.

Bardzo mało jest takich systemów, a to jeden z nich.

Szkoda czasu na systemy.

Ja już mam to za sobą.



//--------------------------

bool tab[8]; // liczby

int para[7][8]; // pary

int trzy[4];// wylosowana trójka

int zak[1000][4];// wylosowane trójki



int main()

{

UprzypadkowijMT();



int i,j,a,v,x,r;



r=0;

do{// losowany koszyk

r++; // numer koszyka



for(i=1;i<=6;i++)

for(j=i+1;j<=7;j++) para[i][j]=0; // zerowanie par

x=0;



do{

x++;

for(i=1;i<=3;i++) trzy[i]=0; // zerowanie trójki

for(i=1;i<=7;i++) tab[i]=0; // zerowanie liczb



for(i=1;i<=3;i++){ // pętla dla losowanej trójki

do{

a = (MersenneTwister() % (7)) +1;// losowanie liczby

}

while (tab[a]>0);// jeśli liczba powtórzona to losuj dalej

tab[a]=1; // zapamiętanie liczby

}



j=0;

for(i=1;i<=7;i++) if(tab[i]==1){j++;trzy[j]=i;} // pobranie wylosowanych liczb - zakład

for(i=1;i<=3;i++) zak[x][i]=trzy[i];// zapisanie zakładu



for(i=1;i<=2;i++)

for(j=i+1;j<=3;j++)

para[trzy[i]][trzy[j]]++; // odnotowanie parez z trójki



v=0;

for(i=1;i<=6;i++)

for(j=i+1;j<=7;j++)

if(para[i][j]>0)v++; // zliczanie ile różnych par

}

while (v < 21); // jeśli mało parek to losuj trójki dalej



}

while (x>7);// jeśli pary pokryte a zakładów jest za dużo to spróbuj wylosować mniej



cout<<"Kombinacji = "<<x<<" losowania = "<<r<<endl<<endl;

cout<<"Wylosowane kombinacje:"<<endl<<endl;



for(i=1;i<=x;i++){

for(j=1;j<=3;j++) cout<<zak[i][j]<<" ";

cout<<endl; }



cout<<endl<<"Wylosowane pary:"<<endl<<endl;



for(i=1;i<=6;i++)

for(j=i+1;j<=7;j++)

cout<<i<<","<<j<<" = "<<para[i][j]<<endl;



cout <<endl<<"Koniec ";

getch();

return 0; }

--- wpis edytowano 2018-05-13 17:56 ---

2018-05-14 (15:46)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 167 823
[ CZCIONKA SPECJALNA ]

No i rzeczywiście wyszedł system matematycznie idealny, choć nie to było moją intencją. Chciałem po prostu sprawdzić, ile potrzeba losowań aby tak jak w załączonym przykładzie, wylosować wszystkie możliwe pary, gdy są losowane trójki z siedmiu liczb. Dziękuję sindbadowi za cierpliwość, którą wykazał tłumacząc na przykładach zawiłości kodu. Jest tu dużo świetnego materiału do analizy, który może zachęcić do przeróbek kodu i próbie stworzenia własnego .exe opartego o kod źródłowy pokazany w załączonych przykładach. Pozdrawiam!
2018-05-14 (18:05)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 849
[ CZCIONKA SPECJALNA ]

Hej!



Ja wpisałem x>7 czyli wymusiłem 7 zakładów.



Zmiana na x<7 da zawsze jeden wariant pokrycia par.



while (x<7);// jeśli pary pokryte to koniec pracy.



--- wpis edytowano 2018-05-14 18:08 ---

2018-05-14 (18:54)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 167 858
[ CZCIONKA SPECJALNA ]

Małe zmiany i program wykonał się 10 milionów razy.

Oto wynik rozkładu pokryć w parach



Potrzebne losowania do pokrycia wszystkich par = ilość razy



7 = 24

8 = 125

9 = 1481

10 = 9311

11 = 32675

12 = 79202

13 = 150725

14 = 240835

15 = 335709

16 = 426320

17 = 503082

18 = 559679

19 = 594629

20 = 610904

21 = 607836

22 = 589015

23 = 561163

24 = 526027

25 = 484802

26 = 441253

27 = 400155

28 = 357651

29 = 318792

30 = 283279

31 = 248592

32 = 218706

33 = 191017

34 = 166835

35 = 145117

36 = 125819

37 = 109445

38 = 94525

39 = 81610

40 = 70251

41 = 60871

42 = 52494

43 = 44872

44 = 38615

45 = 33649

46 = 28871

47 = 24367

48 = 21053

49 = 18032

50 = 15484

51 = 13556

52 = 11636

53 = 10107

54 = 8343

55 = 7399

56 = 6354

57 = 5404

58 = 4531

59 = 3973

60 = 3388

61 = 2978

62 = 2417

63 = 2151

64 = 1861

65 = 1588

66 = 1303

67 = 1160

68 = 1045

69 = 819

70 = 725

71 = 618

72 = 521

73 = 455

74 = 433

75 = 337

76 = 299

77 = 237

78 = 228

79 = 176

80 = 149

81 = 128

82 = 95

83 = 103

84 = 87

85 = 81

86 = 65

87 = 52

88 = 41

89 = 35

90 = 27

91 = 31

92 = 31

93 = 21

94 = 15

95 = 21

96 = 13

97 = 8

98 = 6

99 = 13

100 = 9

101 = 4

102 = 2

103 = 3

104 = 1

105 = 4

106 = 1

107 = 2

109 = 2

110 = 1

113 = 2

116 = 1

117 = 1

121 = 1

125 = 1

127 = 2



Koniec
2018-05-14 (19:56)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 167 867
[ CZCIONKA SPECJALNA ]

>>> Ja wpisałem x>7 czyli wymusiłem 7 zakładów <<<

>>> while (x<7);// jeśli pary pokryte to koniec pracy. <<<



Jeden znak w kodzie, a tak wiele zmienia Jest super !!! Jeszcze raz dziękuję.

2018-05-15 (21:34)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 168 076
[ CZCIONKA SPECJALNA ]

Od dziś używam C++Builder 6



2018-05-15 (21:39)

status sindbad
Data rejestracji: 2008-10-13
Ilość postów: 20465

3794
wpis nr 1 168 080
[ CZCIONKA SPECJALNA ]

Polecam:



http://miroslawzelent.pl/kurs-obiektowy-c++/borland-c++-builder-okienkowy-hello-world/
2018-05-16 (09:47)

status kleszek
Data rejestracji: 2006-05-27
Ilość postów: 4850

2047
wpis nr 1 168 138
[ CZCIONKA SPECJALNA ]

>>> Małe zmiany i program wykonał się 10 milionów razy. <<<



Można prosić o kod tych "małych zmian" ?
| Dodaj wpis w tym temacie | Spis tematów | Wyniki lottoStrona: 1 2 3 4 ... 18 19
Wyślij wiadomość do admina