rand()???

20 отговора 431 прегледа
#1

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.

Отговор
в отговор на help #2

Re: rand()???

izpolzwaj srand()


#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
Отговор
в отговор на malkia #3

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 :)

Отговор
в отговор на l #4

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
Отговор
в отговор на l #5

Re: rand()???

Източник на random event-и могат да бъдат всички входни устройства - мишка, клавиатура, мрежова карта...

Аз бих взел поотделно координатите на мишката, да речем, младшите байтове от свободната памет, time(), както каза malkia, бих ги XOR-нал в една стойност, която бих подал на srand().

Отговор
в отговор на malkia #6

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. Идеята е да е практически невъзможно да предскажеш дадено раздаване, ако разполагаш с предхождащите го.

Отговор
в отговор на hoopla #7

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)? :)

Отговор
в отговор на hoopla #8

Re: rand()???

Някой някъде беше писал, че /dev/urandom подава данни от пула с ентропия, ако там има нещо, иначе генерира псевдо-случайна стойности. Не съм гледал как точно е реализирано, но ако наистина е така може да ти спести първоначания опит за четене от /dev/urandom.

Отговор
в отговор на l #9

Re: rand()???

Мисля че по никакъв начин не може да се получи по-голямо количество случайност (ентропия де :-) от това което е постъпило през I/O устройствата. Всякакви по-нататъшни действия няма да направят данните по-случайни.

Отговор
в отговор на l #10

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 мълчаливо (и доста успешно) се е възползвал от факта. Бриджорите развиват доста добра памет. :)

Отговор
в отговор на Penguin #11

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.

Отговор
в отговор на Penguin #12

Re: rand()???

> Някой някъде беше писал, че /dev/urandom подава данни от пула с ентропия, ако там има нещо, иначе генерира псевдо-случайна стойности. Не съм гледал как точно е реализирано, но ако наистина е така може да ти спести първоначания опит за четене от /dev/urandom.

Честно казано не знам през какъв период /dev/urandom си обновява зародиша, но така или иначе е псевдо през повечето време.

В 2.5 кодът на /dev/random беше сериозно преработен. Четох обсъжданията по въпроса. Там пък какви са параноици... Имаше аргументи за това, че на един сървър, да речем, който не разполага с клавиатура и мишка, или и да разполага, не се ползват, а му се налага да събира случайни стойности, за да генерира ключове, може някой отвън, само като му подава пакети с точно изчислено време между тях, да му влияе предсказуемо върху събраните случайни стойности.

Отговор
в отговор на l #13

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.

Е, идеята е, че кракерът няма достъп до машината, иначе направо ще си раздаде каквото си иска. :)

Просто се опитвам да се предпазя от _чисто_ теоретичната възможност, когато някой разполага с поредица от стойности и алгоритъма, да предскаже следващата стойност.

Алгоритъмът за превръщането на числото също е много интересен. (Изрових го от интернет.) Не е съвсем тривиално да си в състояние да раздадеш всички възможни раздавания, при това с еднаква вероятност и да се побереш в минимален брой битове. Тъй де, няма да ги разхищаваме битовете :))

Отговор
в отговор на hoopla #14

Re: rand()???

a ako zapochne 100 falshivi igri koito shte iztochat istinskata sluchainost w igrata koiato go interesuva?

Отговор
в отговор на help #15

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
Отговор
в отговор на l #16

Re: rand()???

> a ako zapochne 100 falshivi igri koito shte iztochat istinskata sluchainost w igrata koiato go interesuva?

Е, той периодично се пълни. Можеш да си направиш следния експеримент. Пусни си

cat /dev/random | strings -n 1

Ще видиш как ще спре. После почни да тракаш по клавиатурата и веднага ще подкара отново. Тъй че операторът, ако е добре обучен ще може да генерира почти изцяло случайни ръце.

Идеята е да се обезкуражи потенциалният крекър. Като знаеш, че поредицата, която гледаш, не е чисто псевдо, направо ще вдигнеш ръце, защото не знаеш на кои стойности можеш да се довериш, че са генерирани, и кои не са. Това прави задачата ти безнадеждна.

Отговор
в отговор на help #17

Re: rand()???

Ако не страдаш от параноята, обзела останалите, може да идеш на [линк]
Там има не лош туториал за "истински" случайни числа
[линк]

[линк]
Отговор
в отговор на voyager #18

Re: rand()???

wow [линк] dosta e razrasnalo za poslednata godina-dve...

kude po-tochno e tozi link?

tirulirutatuutuu
Отговор
в отговор на malkia #19

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

дао дъ дзин

[линк]
Отговор
в отговор на voyager #20

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:


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
Отговор