rand()???
20 отговора
431 прегледа
rand()???
Ima li nqkakva funkcia ili versia na rand() koqto generira RAZLICHNO 4islo pri vsqko startirane na programata.Naprimer:
1-bo startirane:124545
2-ro startirane:668989
i tn.
Thanks predvaritelno.
1-bo startirane:124545
2-ro startirane:668989
i tn.
Thanks predvaritelno.
Re: rand()???
izpolzwaj srand()
tova raboti - no time(0) e s tochnost do sekundata - nameri neshto koeto da e tochno - s tochnost do milisecundata ili neshto ot tozi rod.
tirulirutatuutuu
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
srand( time(0) );
printf("%d\n",rand());
return 0;
}
tova raboti - no time(0) e s tochnost do sekundata - nameri neshto koeto da e tochno - s tochnost do milisecundata ili neshto ot tozi rod.
tirulirutatuutuu
Re: rand()???
za da stane oshte po-haotichno, moje oswen time da se sloji i pid-a na process-a. ne znam w windows-kia sluchai kakyv e ekvivalenta na pid-a -- namerete si go sami :)
Re: rand()???
pa verno - osven tova /dev/random (ili beshe /dev/urandom) - ednoto ot dvete pazeshe stoinostta ot prednoto zarezhda na linuxa (tuj chetoh az skoro
) - javno tolkoz sum zapomnil koe kakvo beshe...
a inache prosto da si namerih timer sus high-resolution - neshto da mu dawa i milisecundite ili microsecundite - ili prosto tekushtia CPU clock... ili da izwika tam nekva COM funckia da mu generiraa UID - da mu napravi MD5 na nego i da izpolzwa tozi kljuch kum srand() - suvsem she se maskira
tirulirutatuutuu
a inache prosto da si namerih timer sus high-resolution - neshto da mu dawa i milisecundite ili microsecundite - ili prosto tekushtia CPU clock... ili da izwika tam nekva COM funckia da mu generiraa UID - da mu napravi MD5 na nego i da izpolzwa tozi kljuch kum srand() - suvsem she se maskira
tirulirutatuutuu
Re: rand()???
Източник на random event-и могат да бъдат всички входни устройства - мишка, клавиатура, мрежова карта...
Аз бих взел поотделно координатите на мишката, да речем, младшите байтове от свободната памет, time(), както каза malkia, бих ги XOR-нал в една стойност, която бих подал на srand().
Аз бих взел поотделно координатите на мишката, да речем, младшите байтове от свободната памет, time(), както каза malkia, бих ги XOR-нал в една стойност, която бих подал на srand().
Re: rand()???
> pa verno - osven tova /dev/random (ili beshe /dev/urandom) - ednoto ot dvete pazeshe stoinostta ot prednoto zarezhda na linuxa (tuj chetoh az skoro) - javno tolkoz sum zapomnil koe kakvo beshe...
/dev/urandom е Pseudo Number Generator, а /dev/random събира истински случайни събития от периферията, но пък се изпразва бързо, докато PNG работи със скоростта на процесора.
Наскоро писах една функция за раздаване на карти и в духа на истинския параноизъм се стремях да ползвам /dev/random. Оказа се обаче, че ако трябва да се раздават много ръце наведнъж, става много бавно, затова преработих функцията, така че да чете байт по байт в масива от /dev/random, когато има нещо в него, а когато е празен - да чете от /dev/urandom. Идеята е да е практически невъзможно да предскажеш дадено раздаване, ако разполагаш с предхождащите го.
/dev/urandom е Pseudo Number Generator, а /dev/random събира истински случайни събития от периферията, но пък се изпразва бързо, докато PNG работи със скоростта на процесора.
Наскоро писах една функция за раздаване на карти и в духа на истинския параноизъм се стремях да ползвам /dev/random. Оказа се обаче, че ако трябва да се раздават много ръце наведнъж, става много бавно, затова преработих функцията, така че да чете байт по байт в масива от /dev/random, когато има нещо в него, а когато е празен - да чете от /dev/urandom. Идеята е да е практически невъзможно да предскажеш дадено раздаване, ако разполагаш с предхождащите го.
Re: rand()???
niama li da e dostatachno paranoichno, ako predi wsiako razdavane zasiavash srand(3) s chislo ot /dev/random i posle polzwash rand(3)? :)
Re: rand()???
Някой някъде беше писал, че /dev/urandom подава данни от пула с ентропия, ако там има нещо, иначе генерира псевдо-случайна стойности. Не съм гледал как точно е реализирано, но ако наистина е така може да ти спести първоначания опит за четене от /dev/urandom.
Re: rand()???
Мисля че по никакъв начин не може да се получи по-голямо количество случайност (ентропия де :-) от това което е постъпило през I/O устройствата. Всякакви по-нататъшни действия няма да направят данните по-случайни.
Re: rand()???
> niama li da e dostatachno paranoichno, ako predi wsiako razdavane zasiavash srand(3) s chislo ot /dev/random i posle polzwash rand(3)? :)
Възможно ли е нещо да е _достатъчно_ параноично?
rand теоретично може да се разбие, ако разполагаш с достатъчно време, изчислителна мощ и алгоритъма, а моят код е Free, тъй че всеки може да види алгоритъма, е, по-точно да го види в ядрото. Събраните от хардуера стойности няма как да ги предскажеш.
По световните турнири има доста куриози вследствие на слаби алгоритми. На едно първенство даже се е случило да се раздадат ръце, съвпадащи с тези от предишния ден, но на различни позиции. Твърди се, че Zia мълчаливо (и доста успешно) се е възползвал от факта. Бриджорите развиват доста добра памет. :)
rand теоретично може да се разбие, ако разполагаш с достатъчно време, изчислителна мощ и алгоритъма, а моят код е Free, тъй че всеки може да види алгоритъма, е, по-точно да го види в ядрото. Събраните от хардуера стойности няма как да ги предскажеш.
По световните турнири има доста куриози вследствие на слаби алгоритми. На едно първенство даже се е случило да се раздадат ръце, съвпадащи с тези от предишния ден, но на различни позиции. Твърди се, че Zia мълчаливо (и доста успешно) се е възползвал от факта. Бриджорите развиват доста добра памет. :)
Re: rand()???
towa koeto se opitvah da kaja e che ako entropiata e "swyrshila" urandom polzwa syshtia (ili podoben po moshtnost) algoritym za generirane na sluchaini chishla kato tozi na rand(3). i moje bi e po-dobre sluchainite chisla da se polzwat po-oskydno (t.e. za zasiavane predi razdavane), wmesto da se izrazhodvat bezmisleno, i posle da se okaje che pri sledvashtoto razdavane niama nikakvi :)
ne viarvam che nikoi bridgor shte moje da zapomni posledovatelnostta za 10^32 razlichni seed-a :)
otdelno, znaeiki che programata izpolzwa entropiata tolkowa razhititelno e lesno da se napravi taka, che w podhodiashtia moment da niama nikakwa entropia i da triabwa da se polzwa pseudo-random generator-a.
ne viarvam che nikoi bridgor shte moje da zapomni posledovatelnostta za 10^32 razlichni seed-a :)
otdelno, znaeiki che programata izpolzwa entropiata tolkowa razhititelno e lesno da se napravi taka, che w podhodiashtia moment da niama nikakwa entropia i da triabwa da se polzwa pseudo-random generator-a.
Re: rand()???
> Някой някъде беше писал, че /dev/urandom подава данни от пула с ентропия, ако там има нещо, иначе генерира псевдо-случайна стойности. Не съм гледал как точно е реализирано, но ако наистина е така може да ти спести първоначания опит за четене от /dev/urandom.
Честно казано не знам през какъв период /dev/urandom си обновява зародиша, но така или иначе е псевдо през повечето време.
В 2.5 кодът на /dev/random беше сериозно преработен. Четох обсъжданията по въпроса. Там пък какви са параноици... Имаше аргументи за това, че на един сървър, да речем, който не разполага с клавиатура и мишка, или и да разполага, не се ползват, а му се налага да събира случайни стойности, за да генерира ключове, може някой отвън, само като му подава пакети с точно изчислено време между тях, да му влияе предсказуемо върху събраните случайни стойности.
Честно казано не знам през какъв период /dev/urandom си обновява зародиша, но така или иначе е псевдо през повечето време.
В 2.5 кодът на /dev/random беше сериозно преработен. Четох обсъжданията по въпроса. Там пък какви са параноици... Имаше аргументи за това, че на един сървър, да речем, който не разполага с клавиатура и мишка, или и да разполага, не се ползват, а му се налага да събира случайни стойности, за да генерира ключове, може някой отвън, само като му подава пакети с точно изчислено време между тях, да му влияе предсказуемо върху събраните случайни стойности.
Re: rand()???
> otdelno, znaeiki che programata izpolzwa entropiata tolkowa razhititelno e lesno da se napravi taka, che w podhodiashtia moment da niama nikakwa entropia i da triabwa da se polzwa pseudo-random generator-a.
Е, идеята е, че кракерът няма достъп до машината, иначе направо ще си раздаде каквото си иска. :)
Просто се опитвам да се предпазя от _чисто_ теоретичната възможност, когато някой разполага с поредица от стойности и алгоритъма, да предскаже следващата стойност.
Алгоритъмът за превръщането на числото също е много интересен. (Изрових го от интернет.) Не е съвсем тривиално да си в състояние да раздадеш всички възможни раздавания, при това с еднаква вероятност и да се побереш в минимален брой битове. Тъй де, няма да ги разхищаваме битовете :))
Е, идеята е, че кракерът няма достъп до машината, иначе направо ще си раздаде каквото си иска. :)
Просто се опитвам да се предпазя от _чисто_ теоретичната възможност, когато някой разполага с поредица от стойности и алгоритъма, да предскаже следващата стойност.
Алгоритъмът за превръщането на числото също е много интересен. (Изрових го от интернет.) Не е съвсем тривиално да си в състояние да раздадеш всички възможни раздавания, при това с еднаква вероятност и да се побереш в минимален брой битове. Тъй де, няма да ги разхищаваме битовете :))
Re: rand()???
a ako zapochne 100 falshivi igri koito shte iztochat istinskata sluchainost w igrata koiato go interesuva?
lavalamp
Instaliraj lavalamp-a sus kamera i wzimaj sluchaen pixel - dori mozhe za X, i Y da izpolzwash deterministtichnia rand() - prosto za kef ;)
[линк]
lavarand server (SGI)
tirulirutatuutuu
[линк]
lavarand server (SGI)
tirulirutatuutuu
Re: rand()???
> a ako zapochne 100 falshivi igri koito shte iztochat istinskata sluchainost w igrata koiato go interesuva?
Е, той периодично се пълни. Можеш да си направиш следния експеримент. Пусни си
cat /dev/random | strings -n 1
Ще видиш как ще спре. После почни да тракаш по клавиатурата и веднага ще подкара отново. Тъй че операторът, ако е добре обучен
ще може да генерира почти изцяло случайни ръце.
Идеята е да се обезкуражи потенциалният крекър. Като знаеш, че поредицата, която гледаш, не е чисто псевдо, направо ще вдигнеш ръце, защото не знаеш на кои стойности можеш да се довериш, че са генерирани, и кои не са. Това прави задачата ти безнадеждна.
Е, той периодично се пълни. Можеш да си направиш следния експеримент. Пусни си
cat /dev/random | strings -n 1
Ще видиш как ще спре. После почни да тракаш по клавиатурата и веднага ще подкара отново. Тъй че операторът, ако е добре обучен
Идеята е да се обезкуражи потенциалният крекър. Като знаеш, че поредицата, която гледаш, не е чисто псевдо, направо ще вдигнеш ръце, защото не знаеш на кои стойности можеш да се довериш, че са генерирани, и кои не са. Това прави задачата ти безнадеждна.
Re: rand()???
Ако не страдаш от параноята, обзела останалите, може да идеш на [линк]
Там има не лош туториал за "истински" случайни числа
[линк]
[линк]
Там има не лош туториал за "истински" случайни числа
[линк]
[линк]
Re: rand()???
wow [линк] dosta e razrasnalo za poslednata godina-dve...
kude po-tochno e tozi link?
tirulirutatuutuu
kude po-tochno e tozi link?
tirulirutatuutuu
Re: rand()???
mda :) razkrih go :)
[линк]
Ama garantiram za kachestvoto na tutoriala samo dotolkova, dokolkoto mi izglejda logichno. ne sm go probval kak bachka.
Sq gledam che ima nqkakyv bug obache tochno na mqstoto s koda. trqbva da se gleda sorsa na stranicata. Obache mai ne e tolkova genialno, kolkoto go bqh zapomnil ot cheteneto predi nqkolko meseca
дао дъ дзин
[линк]
[линк]
Ama garantiram za kachestvoto na tutoriala samo dotolkova, dokolkoto mi izglejda logichno. ne sm go probval kak bachka.
Sq gledam che ima nqkakyv bug obache tochno na mqstoto s koda. trqbva da se gleda sorsa na stranicata. Obache mai ne e tolkova genialno, kolkoto go bqh zapomnil ot cheteneto predi nqkolko meseca
дао дъ дзин
[линк]
Re: rand()???
naah....
za nachalo e dobre - i dosta hora tova im stiga, no ima security maniatzi (puk i mai si trebe)...
tova koeto pravi tozi tutorial - e tova koeto az opisah - prosto wika time(0) sus srand() w nachaloto... Tova na moja linux - ako se izpulni burzo i shte widish che dwa-tri puti (zawisi ot skorostta) shte ima sushtite stoinosti.. Tova e taka zashtoto time(0) ti wrushta wremeto w sekundi i e mnogo vuzmozhno i sledwshtia zapusk na testovata programka da e pak wuw sushtite sekundi... Zatova mu predlozhih da si nameri neshto koeto wzima i stotni/milisecundi tam (ne e mnogo portable obache)...
Inache tova si e napulno deterministichen random() - edin wid funckia kojato idealno na teoria bi razpredelila wsichki generirani chisla po ravno. Abe edin vid ako si napravish
[url]
int i;
int masiv[256];
srand( time(0) );
memset(masiv, 0, sizeof(masiv));
for(i=0;i<256;i++)
masiv[rand()%256]++;
[/url]
to bi trjabwalo da njama nulevi elementi, ili wsichkite elementi da sa edinitza - tova e idealnia algorithm.
rand() ne e nishto poeveche ot njakakwa "slozhna" funkcia: eto kakvo pravi na MSVC-CRT-to:
(ot mjastoto kudeto go izrowih tova - funckia kojato prediktwa na MSVC-to randoma)
wizh po-dobre tuka [линк]
horata inache otdavna govorjat za Mersenne Twistera - burza i po-trudna za reverswane
funckia - eto wizh tuka:
[линк]
btw - [линк] ima dosta specialisti po razni takiva temi :)
a inache LAVALAMP-ata e istinskoto reshenie - ili puk si predstawi kamera - kojato snima navalicata hora deto minawat w Sofia - ili pretupkanite ulitzi - pravi na wsjaka snimka njakakuw hash code, CRC ili MD5 suma (ot digitalnoto izobrazhenie) i izpolzwaj tova za random chislo - no si e bavno ;) - osven tova neznam dali e garantirano che shte razpredelja rawnomerno oblasta za kojato shte wikash tazi funckia.
tirulirutatuutuu
za nachalo e dobre - i dosta hora tova im stiga, no ima security maniatzi (puk i mai si trebe)...
tova koeto pravi tozi tutorial - e tova koeto az opisah - prosto wika time(0) sus srand() w nachaloto... Tova na moja linux - ako se izpulni burzo i shte widish che dwa-tri puti (zawisi ot skorostta) shte ima sushtite stoinosti.. Tova e taka zashtoto time(0) ti wrushta wremeto w sekundi i e mnogo vuzmozhno i sledwshtia zapusk na testovata programka da e pak wuw sushtite sekundi... Zatova mu predlozhih da si nameri neshto koeto wzima i stotni/milisecundi tam (ne e mnogo portable obache)...
Inache tova si e napulno deterministichen random() - edin wid funckia kojato idealno na teoria bi razpredelila wsichki generirani chisla po ravno. Abe edin vid ako si napravish
[url]
int i;
int masiv[256];
srand( time(0) );
memset(masiv, 0, sizeof(masiv));
for(i=0;i<256;i++)
masiv[rand()%256]++;
[/url]
to bi trjabwalo da njama nulevi elementi, ili wsichkite elementi da sa edinitza - tova e idealnia algorithm.
rand() ne e nishto poeveche ot njakakwa "slozhna" funkcia: eto kakvo pravi na MSVC-CRT-to:
int __cdecl rand (
void
)
{
#ifdef _MT /* Multithreaded */
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
#else
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) &
0x7fff);
#endif
}
// holdrand - njakoi drugi go wikat seed oshte - wizh naprimer srand(seed)
(ot mjastoto kudeto go izrowih tova - funckia kojato prediktwa na MSVC-to randoma)
wizh po-dobre tuka [линк]
horata inache otdavna govorjat za Mersenne Twistera - burza i po-trudna za reverswane
funckia - eto wizh tuka:
[линк]
btw - [линк] ima dosta specialisti po razni takiva temi :)
a inache LAVALAMP-ata e istinskoto reshenie - ili puk si predstawi kamera - kojato snima navalicata hora deto minawat w Sofia - ili pretupkanite ulitzi - pravi na wsjaka snimka njakakuw hash code, CRC ili MD5 suma (ot digitalnoto izobrazhenie) i izpolzwaj tova za random chislo - no si e bavno ;) - osven tova neznam dali e garantirano che shte razpredelja rawnomerno oblasta za kojato shte wikash tazi funckia.
tirulirutatuutuu