manfred Temat założony przez niniejszego użytkownika |
» 2008-11-16 15:02:02 Mój kod ;) Jak widać, używam tablicy bez używania tablic, bawiąc się tylko operacjami bitowymi... |
|
manfred Temat założony przez niniejszego użytkownika |
» 2008-11-16 15:40:29 Poprawione, dodałem jeszcze sortowanie ;P #include <cstdlib> #include <iostream> #include <iomanip>
using namespace std;
unsigned long a1_32 = 0xFFFFFFFF, a33_64 = 0xFFFFFFFF;
unsigned char Randek() { unsigned char i, j; while( true ) { i =( rand() % 49 ) + 1; if( i > 32 ) { j = i - 32; if(( a33_64 &( 1 << j ) ) >> j ) { a33_64 = a33_64 &( ~( 1 << j ) ); return i; } } else { if(( a1_32 &( 1 << i ) ) >> i ) { a1_32 = a1_32 &( ~( 1 << i ) ); return i; } } } }
unsigned int Losuj( bool init = 0 ) { if( init ) { a1_32 = 0xFFFFFFFF; a33_64 = 0xFFFFFFFF; } return Randek(); }
int main() { srand( time( 0 ) ); for( int i = 0; i < 100; i++ ) { int i1, i2, i3, i4, i5, i6; i1 = Losuj( 1 ); i2 = Losuj(); i3 = Losuj(); i4 = Losuj(); i5 = Losuj(); i6 = Losuj(); for( int j = 1; j <= 49; j++ ) { if( j == i1 ) cout << setw( 3 ) << i1 << " "; else if( j == i2 ) cout << setw( 3 ) << i2 << " "; else if( j == i3 ) cout << setw( 3 ) << i3 << " "; else if( j == i4 ) cout << setw( 3 ) << i4 << " "; else if( j == i5 ) cout << setw( 3 ) << i5 << " "; else if( j == i6 ) cout << setw( 3 ) << i6 << " "; } cout << endl; } cin.get(); } |
|
manfred Temat założony przez niniejszego użytkownika |
» 2008-11-16 16:52:09 Aha, nie przestawajcie próbować, im więcej zakręconych sposobów skodzenia tego, tym ciekawiej! Może się okazać, że ktoś trafi na jakiś bardzo ciekawy sposób, który jest szybszy od niejednego algo uzywajacego tablic! Mój ma nad najprostszym algo tylko tą przewagę, że bierze z ramu na tablice 8 bajtów, a nie 49 /bool foo[49]/... |
|
manfred Temat założony przez niniejszego użytkownika |
» 2008-11-16 17:38:53 Dodatek do twojego pomysłu: Losuj liczby 100 razy tak jak u mnie, żeby było co mierzyć. Jak już skończysz ze swoim to sprawdź i mój, bo nie mam kompilatora przy sobie... |
|
manfred Temat założony przez niniejszego użytkownika |
» 2008-11-16 20:23:49 Jako ciekawostkę sprawdź czas wykonywania się najprostszego sposobu na tablicach, wtedy będziemy mieli jakiś punkt odniesienia... |
|
manfred Temat założony przez niniejszego użytkownika |
» 2008-11-16 21:52:56 Jutro zrobię prog na symbolu newtona, nie będzie tam żadnej pętli związanej z powtarzaniem się wartości, będą tylko te potrzebne do wyciągnięcia zbioru z jego numeru... |
|
manfred Temat założony przez niniejszego użytkownika |
» 2008-11-29 11:55:10 Taa... miało być już dawno temu, ale dziś sobie o tym przypomniałem. Kod: #include <ctime> #include <iostream> #include <iomanip>
using namespace std;
class MersenneTwister { private: unsigned MT[ 624 ]; unsigned index; void initializeGenerator( unsigned seed ) { index = 0; MT[ 0 ] = seed; for( unsigned i = 1; i < 624; ++i ) { unsigned long long a =( 1812433253 *( MT[ i - 1 ] ^( MT[ i - 1 ] >> 30 ) ) + 1 ) & 0xFFFFFFFF; MT[ i ] = a; } } void generateNumbers() { for( unsigned i = 0; i < 624; ++i ) { unsigned y =( MT[ i ] & 0x80000000 ) +( MT[( i + 1 ) % 624 ] & 0x7FFFFFFF ); MT[ i ] = MT[( i + 397 ) & 624 ] ^( y >> 1 ); if( y & 1 ) { MT[ i ] ^= 2567483615; } } } public: MersenneTwister( unsigned seed = 0 ) : index( 0 ) { initializeGenerator( seed ); } unsigned rand() { if( index == 0 ) { generateNumbers(); } unsigned y = MT[ index ]; y ^= y >> 11; y ^= y << 7 & 2636928640; y ^= y << 15 & 4022730752; y ^= y >> 18; index =( index + 1 ) % 624; return y; } unsigned rangeRand( unsigned int max = 0xFFFFFFFF, unsigned int min = 0 ) { return this->rand() %( max - min + 1 ) + min; } };
unsigned silnia( unsigned n ) { int s = 1; while( n ) { s *= n; n--; } return s; }
unsigned long long C( unsigned n, unsigned k ) { unsigned long long wynik = 1; unsigned i = k; while( i ) { wynik *= n; n--; i--; } return wynik / silnia( k ); }
void pierwsze() { static MersenneTwister r( time( 0 ) ); unsigned l = 1 + r.rangeRand( C( 49, 6 ) ); unsigned zIlu = 49; long long s = 0; unsigned n = zIlu - 1; unsigned k = 5; long long poprzednia = 0; for( unsigned i = 0; i < 6; i++ ) { while( s < l ) { poprzednia = s; s += C( n, k ); n--; } unsigned liczba = zIlu - n - 1; cout << setw( 3 ) << liczba << " "; l -= poprzednia; n = zIlu - liczba - 1; s = 0; poprzednia = 0; k--; } cout << endl; }
int main() { for( unsigned i = 0; i < 100; i++ ) { pierwsze(); } } 0.0125 milisekundy na jedno losowanie (uruchomienie przez : mersenne_twister > log.txt, jeżeli miałby zapisywać na konsolę to ma 0.47 ms na jedno losowanie /ale to jest narzut konsoli/). |
|
1 « 2 » |