Forum strony www.multipasko.pl [Regulamin]


Dodaj wpis w tym temacie
Spis tematów
Login:

Hasło:
Strona: 1
Wyślij wiadomość do admina

Przewiń wpisy ↓

Generatory pseudolosowe

2006-11-06 (23:17)

status Aniel
Data rejestracji: 2005-11-07
Ilość postów: 590

1383
wpis nr 80 674
[ CZCIONKA SPECJALNA ]

Moim zdaniem dobrym sposobem moze byc tworzenie zestawow przez generatory pseudolosowe.



Moze macie jakies linki do takich generatorów albo cos w tym stylu.



Generator np jest w programie MultiSys3.



Ale moze macie jakies inne.
2006-11-06 (23:48)

status Darek
Data rejestracji: 2003-10-13
Ilość postów: 213

154
wpis nr 80 675
[ CZCIONKA SPECJALNA ]

Ja raz stworzylem baze wynikow losowo komputerem zeby porownac z lotkiem i liczby byly rownomiernie rozsiane bez zaburzen tak jak w lotku.

To taka mala uwaga o generatorach losowych.

Acha i metoda chybil trafil jest gosza od najglupszej analizy bo wspolczynnik trafienia na chybil trafil jest najblizszy modelowi prawdopodobienstwa (potwierdzilem to robiac experyment).

pozdro
2006-11-07 (08:40)

status dylong
Data rejestracji: 2006-07-21
Ilość postów: 2814

2572
wpis nr 80 681
[ CZCIONKA SPECJALNA ]

Aniel - chcialbym Ci zaproponowac kilka malenkich programów generatorów autorstwa Saliu.

PermuteCombine.exe

http://saliu.com/pub/PermuteCombine.exe



Combinations.exe

http://saliu.com/pub/Combinations.exe



BellCurveGenerator.exe

http://dl.winsite.com/bin/downl?17500000036945

Ten progran jest pobierany z innej strony (nie z portalu Saliu) i troche trwa zanim rozpocznie sie jego zasysanie. Jest generator zestawów wykorzystujacy FFG autorstwa Saliu (Fundamental Formula of Gambling). Generuje zestawy mieszczace sie posrodku krzywej dzwonowej, w zwiazku z czym skrajnosci sa odrzucane (ja na kilkadziesiat tysiecy wygenerowanych zestawów nie otrzymalem ani jednego rozpoczynajacego sie od liczby 1)



RandomNumbers.exe

http://www.saliu.com/pub/RandomNumbers.exe

Jeden z nowszych programów - mozna wykorzystac tu opcje odstepu czasowego pomiedzy generowanymi liczbami. Ma to na celu symulacje prawdziwego losowania gdzie kule pojawiaja sie stopniowo.



Oczywiscie dowolne zestawy mozna generowac korzystajac z MDIEditor And Lotto WE którego Version 4.0_WE ~ Final niedawno sie ukazala. Zdecydowanie polecam

http://www.download.com%2F3001-2647_4-10593963.html

Nie wiem czy ten link u góry dobrze sie wkleil, w kazdym razie linki do tych i innych programów mozna znalezc na http://www.saliu.com/infodown.html



Pozdrawiam
2006-11-07 (14:00)

status Darek
Data rejestracji: 2003-10-13
Ilość postów: 213

154
wpis nr 80 707
[ CZCIONKA SPECJALNA ]

Dzieki za fajny link o generatorach

Ciekawe jakie algorytmy koles uzyl do generowania liczb bo ja znam tylko ten z windy co wykozystuje ziarno i potem je mieli

pozdro
2006-11-07 (15:56)

status dylong
Data rejestracji: 2006-07-21
Ilość postów: 2814

2572
wpis nr 80 712
[ CZCIONKA SPECJALNA ]

Saliu twierdzi, ze jego generatory sa naprawde losowe. Na stronie http://www.saliu.com/random-numbers.html zamiescza przyklad najprostszego generatora (w jezyku PowerBasic) daje porcje teorii o zasadach tworzenia generatorów oraz wyjasnia, czym jego produkty odrózniaja sie od innych. Mój angielski kulawy a slownictwo Saliu z górnej pólki, ale tak w skrócie (moze nie popelnie kardynalnych bledów).

Komputery moga generowac liczby o wysokim stopniu losowosci poprzez reczny wybór lub w oparciu o urzadzenia zewnetrzne. Pierwszym niezbednym warunkiem jest wygenerowania tzw. random seeds (losowego ziarna). W przypadku wykorzystania do tego zegara komputera losowosc wygenerowanych liczb jest bardzo niska - nie losowa a pseudo-losowa.

Drugim niezbednym warunkiem zapewnienia losowosci jest predkosc wykonania. Im wyzsza predkosc tym nizszy stopien losowosci. Przykladowo program pobiera liczbe zmiennopozycyjna 18-cyfrowa i wytwarza pierwsza liczbe losowa (która jest liczba zmiennopozycyjne w przedziale od 0 do 1). Potem program mnozy te liczbe przez najwieksza liczbe w grze lotto. Wszystko dzieje sie bardzo szybko. Potem program generuje nastepna liczbe zmiennopozycyjna i mnozy to jeszcze raz itd. Poniewaz obliczenia sa niezwykle szybkie, efektem pracy takiego generatora sa zestawy skladajace sie z liczb sasiadów (bardzo blisko siebie lezacych). Saliu wspomina czasy kiedy korzystal z komputera Atari do wytwarzania liczb losowych - liczby wytwarzane przez ten komputerek zapewnialy znacznie wyzszy stopien losowosci niz wspólczesny pecet. Obecnie, nalezy opózniac generowanie liczb aby poprawic stopien losowosci. Jak wyglada przykladowy zly generator:



FOR Counter = 1 to 6

RANDOMIZE TheSeed

Lottonumber(Counter) = CLNG(RND * 49) + 1

NEXT Counter



Taka konstrukcja zapewnia, ze w generowanych zestawach pewne liczby beda sie czesto powtarzac badz zestawy beda sie skladac z liczb lezacych blisko siebie. Saliu zauwazyl, ze dla poprawy dzialania nalezy:

- polecenie generowania SEED wyprowadzic przed petle FOR

- przed instrukcje NEXT wprowadzic opóznienie DELAY

Dalej Saliu pisze, ze najwazniejsze jest wygenerowanie losowego parametru SEED. W kodzie który przedstawil korzysta on nie z zegara systemowego ale z funkcji daty i czasu. Jak pisze wielu myli losowosc z prawdopodobienstwem. Jesli SEED zawiera sie w przedziale od 1 do 10 to nie mozna mówic o losowosci. Im wieksze pasmo SEED tym i jego losowosc jest wieksza. Jesli uzywa sie funkcji TIMER zawierajacej tylko 86400 wartosci (liczba sekund w dobie) to moze sie zdarzyc, ze uruchamiajac generator w tym samym czasie ale innego dnia otrzymamy identyczna sekwencje liczb nie losowych a pseudo-losowych. Saliu pisze, ze nawet prosty SEEDER który przedstawil na swej stronie potrafi wytworzyc miliony (miliardy) niepowtarzalnych parametrów SEED.

Oczywiscie programik którego kod zródlowy przedstawil jest tylko najprostsza konstrukcja poprawnego generatora. W swoich programach uzywa on nawet dwunastu sprzegnietych ze soba algorytmów. Oczywiscie nie zamierza on ich publikowac.
2006-11-07 (18:35)

status Aniel
Data rejestracji: 2005-11-07
Ilość postów: 590

1383
wpis nr 80 746
[ CZCIONKA SPECJALNA ]

Dzieki Dylong za podane linki - zanim to ``przetrawie`` to pewnie troche czasu minie.
2006-11-08 (17:13)

status Darek
Data rejestracji: 2003-10-13
Ilość postów: 213

154
wpis nr 80 858
[ CZCIONKA SPECJALNA ]

Witam

Twoj angielski i tak jest lepszy od mojego.



Ten gosc napisal tak: \"W przypadku wykorzystania do tego zegara komputera losowosc wygenerowanych liczb jest bardzo niska\"

(zgodnie z twoim tlumaczeniem)



Nie wiem jakich generatorow uzywaja inne jezyki ale c++ ma fajny generator i tworzy ziarno z aktualnego czasu i nie sadze zeby to bylo nie wystarczajace bo ten czas jest liczony w sekundach od 00:00 1.01.1970 wiec minelo juz 36 lat od poczatku licznika i jeszcze sie nie przekrecil

A dokladnie mamy 31 536 000 sekund rocznie (okolo) a pojemnosc licznika to liczba 4 bajtowa czyli 4 294 967 295 i wystarczy licznika na 136 lat.

Wiec moim zdaniem tyle czasu wystarczy a zawsze mozna skomplikowac algorytm poprzez losowe sortowanie losowej tablicy itp.

Zainteresowanym moze wyjasnie jak wyglada tworzenie liczby losowej w c++

Funkcja przenosi ziarno (ilosc sekund od 1970) do zmiennej holdrand

i wykonuje tylko jedna linijke kodu !

return ((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff;



Wyglada to tak:

Aktualna wartosc holdrand mnozy przez 214013 i dodaje 2531011

I tu jest sekret bo licznik sie przekreca i ma nowa wartosc a potem jeszcze robi >> 16 czyli starsze 2 bajty zapisuje na miejsce mlodszych 2 bajtow nie wiem czy sie nie myle ale to jest chyba odpowiednik dzielenia przez 65536

(wystarczy przesunac wartosc o 16 bitow (2 bajty) w prawo a kazde 1 przesuniecie to dzielenie przez 2 a 16 przesuniec to dzielenie przez 2 do potegi 16 czyli 65536)

Po tej operacji robi jeszcze & 0x7fff czyli zerowanie 2 starszych bajtow na wszelki wypadek

i mamy 2 bajtowa liczbe losowa z przedzialu od 0 do 65535 ktora jeszcze na koniec zapisuje program na pozycje naszego poprzedniego holdrand

I teraz za kazdym wykonaniem tego samego kodu mamy inna liczbe \"losowa\" ktora spelnia wymagania losowosci.

Generatory losowe sa wykozystywane w grach przez internet np w expekt

Oczywiscie nie takie proste jak ten opisany tylko maja swoje zatwierdzone i kontrolowane przez odpowiednie instytucje.



Pozdrawiam.



2006-11-08 (19:16)

status dylong
Data rejestracji: 2006-07-21
Ilość postów: 2814

2572
wpis nr 80 873
[ CZCIONKA SPECJALNA ]

Darku - masz racje. Pan Saliu tworzy swe dziela w dosc egzotycznych jezykach (na przyklad PowerBasic), i z pewnoscia przyklad do którego sie odwoluje (pasmo dla SEED równe ilosci sekund w dobie) nie ma zastosowania w chwili obecnej w jakimkolwiek generatorze i raczej mowa jest o takim przypadku dla celów dydaktycznych. Twój przyklad tez jest oczywiscie najprostszym i na pewno do zaawansowanych zastosowan nie jest uzywany, tym niemniej jest to w tej chwili domyslny generator w Windows (sposób liczenia czasu rzecz jasna z Unixa). Tak naprawde nie powinno miec to dla nas zadnego znaczenia, wazny jest koncowy (generowane zestawy, ich jakosc czytaj \"losowosc\") - mysle jednak, ze o takich podstawach warto pamietac. I rozmyslac - od rozmyslania o konstrukcji generatorów liczb losowych blisko bowiem do rozmyslania o samej naturze losowosci a potem to juz krok do kasyna czy kolektury



Pozdrawiam i zycze zadowolenia z produktów Saliu



2007-08-07 (19:26)

status Nicolas
Data rejestracji:
Ilość postów:

wpis nr 102 434
[ CZCIONKA SPECJALNA ]

Nice...

2008-11-18 (21:46)

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

2047
wpis nr 163 852
[ CZCIONKA SPECJALNA ]

Gdzieś w sieci znalazłem fajne makro do excela generujące dowolną ilość zestawów.





Option Explicit

Option Base 1

Public jj As Long

Public Const iteration = 240



\'***********************************************************************

\'* Resampling Process *

\'***********************************************************************







Sub Resample()

Dim i As Long

Dim hold(80) As Single, Hold2(80) As Single

Randomize



For i = 1 To 80

Hold2(i) = i

Next i



For jj = 1 To iteration



For i = 1 To 80

hold(i) = Rnd

Next i



Call DoubleSort(80, hold, Hold2)



For i = 1 To 3

Cells(jj, i) = Hold2(i)

Next i



Next jj



End Sub



\'***********************************************************************

\'* Sorting Process - Sort array y based on array x *

\'***********************************************************************



Sub DoubleSort(n As Long, x() As Single, y() As Single)

Dim xTemp As Double

Dim yTemp As Double

Dim i As Long

Dim j As Long



For j = 2 To n



xTemp = x(j)

yTemp = y(j)



For i = j - 1 To 1 Step -1

If (x(i) <= xTemp) Then GoTo 10

x(i + 1) = x(i)

y(i + 1) = y(i)

Next i



i = 0

10 x(i + 1) = xTemp

y(i + 1) = yTemp



Next j



End Sub

Zmieniając wartość w linijce kodu Public Const iteration = 240 zmieniamy ilość generowanych zestawów. Zmieniając wartość w linijce kodu For i = 1 To 3 zmieniamy ilość liczb w zestawie ( w tym konkretnym przypadku makro tworzy 240 zestawów po 3 liczby). Zwracam się do znawców Excela , czy nie można tego makra przerobić tak, aby tworzył on zestawy z liczb własnych użytkownika. Np. w kolumnie J wpisałbym powiedzmy 40 wybranych liczb a makro generowało by 240 zestawów tylko z tych liczb,które są wpisane w kolumnie J. A może ktoś zna jakieś inne makro excela generujące zestawy z liczb użytkownika. Pozdrawiam i liczę na Waszą pomoc
2008-11-19 (17:32)

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

2047
wpis nr 164 004
[ CZCIONKA SPECJALNA ]

Problem rozwiązany.Otrzymałem pomoc od kolegów na innym forum.Podaję pełne makro, które tworzy zestawy z liczb wpisanych do kolumny \"J\".Być może komuś się przyda taki generatorek

Option Explicit

Option Base 1

Public jj As Long

Public Const iteration = 240



\'***********************************************************************

\'* Resampling Process *

\'***********************************************************************



Sub Resample()

Dim i As Long, ile As Long

Dim hold() As Single, Hold2() As Single

Randomize

ile = Cells(Rows.Count, \"J\").End(xlUp).Row

ReDim hold(1 To ile)

ReDim Hold2(1 To ile)

For i = 1 To ile

Hold2(i) = i

Next i



For jj = 1 To iteration



For i = 1 To ile

hold(i) = Rnd

Next i



Call DoubleSort(ile, hold, Hold2)



For i = 1 To 3

Cells(jj, i) = Cells(Hold2(i), \"J\")

Next i



Next jj



End Sub



\'***********************************************************************

\'* Sorting Process - Sort array y based on array x *

\'***********************************************************************



Sub DoubleSort(n As Long, x() As Single, y() As Single)

Dim xTemp As Double

Dim yTemp As Double

Dim i As Long

Dim j As Long



For j = 2 To n



xTemp = x(j)

yTemp = y(j)



For i = j - 1 To 1 Step -1

If (x(i) <= xTemp) Then GoTo 10

x(i + 1) = x(i)

y(i + 1) = y(i)

Next i



i = 0

10 x(i + 1) = xTemp

y(i + 1) = yTemp



Next j



End Sub
2008-11-19 (17:53)

status login_2009
Data rejestracji: 2008-10-09
Ilość postów: 464

3787
wpis nr 164 006
[ CZCIONKA SPECJALNA ]

Heja!

Identyczne co twoje, tylko odrobinkę prostsze:

Sub NumberGen()

Range(\"A1\").Value = RandomNumber()

Range(\"A2\").Value = RandomNumber()

Range(\"A3\").Value = RandomNumber()

Range(\"A4\").Value = RandomNumber()

Range(\"A5\").Value = RandomNumber()

Range(\"A6\").Value = RandomNumber()

Range(\"A7\").Value = RandomNumber()

Range(\"A8\").Value = RandomNumber()

Range(\"A9\").Value = RandomNumber()

Range(\"A10\").Value = RandomNumber()

Range(\"B1\").Value = RandomNumber()

Range(\"B2\").Value = RandomNumber()

Range(\"B3\").Value = RandomNumber()

Range(\"B4\").Value = RandomNumber()

Range(\"B5\").Value = RandomNumber()

Range(\"B6\").Value = RandomNumber()

Range(\"B7\").Value = RandomNumber()

Range(\"B8\").Value = RandomNumber()

Range(\"B9\").Value = RandomNumber()

Range(\"B10\").Value = RandomNumber()

Range(\"C1\").Value = RandomNumber()

Range(\"C2\").Value = RandomNumber()

Range(\"C3\").Value = RandomNumber()

Range(\"C4\").Value = RandomNumber()

Range(\"C5\").Value = RandomNumber()

Range(\"C6\").Value = RandomNumber()

Range(\"C7\").Value = RandomNumber()

Range(\"C8\").Value = RandomNumber()

Range(\"C9\").Value = RandomNumber()

Range(\"C10\").Value = RandomNumber()

End Sub

Function RandomNumber() As Integer

\' Create a pseudo random number pool

Randomize

\' We do this below so not to get 0

RandomNumber = Int((22 - 1) * Rnd + 1)

End Function

2008-11-19 (18:09)

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

2047
wpis nr 164 011
[ CZCIONKA SPECJALNA ]

login_2009 sprawdziłem Twoje makro i niezupełnie jest takie samo jak ja podałem.Twoje makro generuje liczby w komórkach bez sprawdzenia czy w wierszach nie powtarza się ta sama liczba. U mnie na przykład po uruchomieniu tego makra wyszedł układ 7,7, 11 co dyskwalifikuje ten układ jako trójkę
| Dodaj wpis w tym temacie | Spis tematów | Wyniki lottoStrona: 1
Wyślij wiadomość do admina