Цитата(osnwt @ Mar 8 2006, 00:05)

Вопрос лишь в том: "Точно ли такой алгоритм используется, скажем, в стандартной библиотеке C"?
...
В лучшем кое-где используются отдельные датчики случайных чисел, основанные на физических принципах (шумы p-n перехода, к примеру). Вряд ли в бытовых PC, конечно. Но можно было бы наверняка придумать что-то получше.
Алгоритм не стандартизирован никак. Более того, никак не гарантирована его псевдослучайность
для повторения. Предыдущий пример взят из реальной жизни - это Borland.
Ниже вариант 'послиднее', это IAR. Можете продолжить исследования - на более доступных
в исходных текстах библиотеках.
Код
#define TSIZ 32 /* must be power of two */
#define TMSK (TSIZ - 1)
#define XRND(x) (x) * 1664525L + 1013904223L
_TLS_DATA_DEF(_IMPLICIT_EXTERN, char, _Randinit, 0);
_TLS_DATA_DEF(_IMPLICIT_EXTERN, unsigned long, _Randseed, 1);
_TLS_DATA_DEF(static, unsigned long, idx, 0);
_TLS_ARR_DEF(static, unsigned long, rv, TSIZ);
int (rand)(void)
{ /* compute pseudo-random value */
char *pinit = _TLS_DATA_PTR(_Randinit);
unsigned long *pseed = _TLS_DATA_PTR(_Randseed);
unsigned long *pidx = _TLS_DATA_PTR(idx);
unsigned long *prv = _TLS_ARR(rv);
int j;
if (*pinit == 0)
{ /* warm up, then initialize shuffle table */
for (j = 0; j < 8; ++j)
*pseed = XRND(*pseed);
for (j = 0; j < TSIZ; ++j)
prv[j] = (*pseed = XRND(*pseed));
*pidx = prv[TSIZ - 1];
*pinit = 1;
}
*pseed = XRND(*pseed);
j = *pidx & TMSK;
*pidx = prv[j];
prv[j] = *pseed;
#if _ILONG
return (*pidx & RAND_MAX);
#else /* _ILONG */
return ((*pidx >> 16) & RAND_MAX);
#endif /* _ILONG */
}
Цитата(osnwt @ Mar 8 2006, 00:05)

В лучшем кое-где используются отдельные датчики случайных чисел, основанные на физических принципах (шумы p-n перехода, к примеру). Вряд ли в бытовых PC, конечно. Но можно было бы наверняка придумать что-то получше.
Я в курсе. Осталось решить вопрос, как Вы сможете повторить сию последовательность для
расшифровки :-))).
Ну а 'получше' уже придуманы, только для сишного rand они не используются.