Алгоритм работы ф-ции rand()

lifer

Guest
Алгоритм работы ф-ции rand()

Кто знает как реализована ф-ция rand() в PHP?
Можно ли где-то посмотреть алгоритм её работы?
 

Alien

Новичок
vladax сам понял что написал?

lifer исходники php доступны. Качай и смотри ...
 

vladax

Новичок
упс..
вопрос слишком не внимательно прочитал..
сорри
 

tony2001

TeaM PHPClub
предалагаю не останавливаться и смотреть сорцы libc, конкретно - функции rand() & srand(), т.к. именно они и используется [m]rand[/m].
 

lifer

Guest
2 Tn
Извини, бывает.

2 tony2001
Спасибо. Скачал исходники libc.
 

tony2001

TeaM PHPClub
>Спасибо. Скачал исходники libc.
гм..
для тех, кто не понял:
это была шутка.
 

AnToXa

prodigy-одаренный ребенок
исходники libc - хммм...
сколько там? 150 метров ? :)

стоит ли оно того ? :)
 

lifer

Guest
гм..
для тех, кто не понял:
это была шутка.
---
Народ, не прикалывайтесь...
Вот что я нашёл:

rand.c

/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Posix rand_r function added May 1999 by Wes Peters <[email protected]>.
*
* $Id: rand.c,v 1.2 2002/10/16 15:52:25 joerg_wunsch Exp $
*/

/*
* From:
static char sccsid[] = "@(#)rand.c 8.1 (Berkeley) 6/14/93";
*/

#include <stdlib.h>

static int
do_rand(unsigned long *ctx)
{
#ifdef USE_WEAK_SEEDING
/*
* Historic implementation compatibility.
* The random sequences do not vary much with the seed,
* even with overflowing.
*/
return ((*ctx = *ctx * 1103515245L + 12345L) %
((unsigned long)RAND_MAX + 1));
#else /* !USE_WEAK_SEEDING */
/*
* Compute x = (7^5 * x) mod (2^31 - 1)
* wihout overflowing 31 bits:
* (2^31 - 1) = 127773 * (7^5) + 2836
* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
*/
long hi, lo, x;

hi = *ctx / 127773L;
lo = *ctx % 127773L;
x = 16807L * lo - 2836L * hi;
if (x <= 0)
x += 0x7fffffffL;
return ((*ctx = x) % ((unsigned long)RAND_MAX + 1));
#endif /* !USE_WEAK_SEEDING */
}


int
rand_r(unsigned long *ctx)
{
return do_rand(ctx);
}


static unsigned long next = 1;

int
rand(void)
{
return do_rand(&next);
}

void
srand(unsigned int seed)
{
next = seed;
}
 

tony2001

TeaM PHPClub
скажи: а с какой целью ты пытаешься накачать сорцов и увидеть " как реализована ф-ция rand() в PHP" ?
хочется знать "чегой у неё внутре" ?
или есть какой-то практический интерес ?
 

valyala

Новичок
Re: Алгоритм работы ф-ции rand()

Автор оригинала: lifer
Кто знает как реализована ф-ция rand() в PHP?
Можно ли где-то посмотреть алгоритм её работы?
Код:
PHPAPI long php_rand(TSRMLS_D)
{
    long ret;

#ifdef ZTS
    ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
    ret = random();
# elif defined(HAVE_LRAND48)
    ret = lrand48();
# else
    ret = rand();
# endif
#endif

    return ret;
}
Код функции php_rand_r() выглядит так:
Код:
static int
do_rand(unsigned long *ctx)
{
    return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)PHP_RAND_MAX + 1));
}

PHPAPI int
php_rand_r(unsigned int *ctx)
{
    u_long val = (u_long) *ctx;
    *ctx = do_rand(&val);
    return (int) *ctx;
}
Функции random(), lrand48() и rand() не входят в исходники PHP. Но, скорее всего, все они основаны на простом линейном конгруэнтном генераторе псевдослучайной последовательности чисел, аналогичном тому, что используется в функции do_rand(), приведенной выше
 

lifer

Guest
скажи: а с какой целью ты пытаешься накачать сорцов и увидеть " как реализована ф-ция rand() в PHP" ?
Просто интересно как именно получается случайное число.
 

[DAN]

Старожил PHPClub
компьютер не может (за очень редким исключением) генерить случайные числа.
Все они псевдослучайные.
Более того, проанализируй последоавательность этих чисел, и ты обнаружишь, что она циклическая с большим периодом.
И еще прикол, сравни две последовательности, сгенерированные на двух разных компах. Приятно удивишься.
 

HEm

Сетевой бобер
Автор оригинала: lifer
Просто интересно как именно получается случайное число.
Если тебе "просто интересно" то тебе надо было спрашивать не "где посмотреть как сделано в пхп" а "какие алгоритмы бывают и где их посмотреть" на что тебя вполне заслуженно пошлют гуглом
 

AnToXa

prodigy-одаренный ребенок
какие-нибудь квантовые генераторы имхо.
 

tony2001

TeaM PHPClub
>Если тебе "просто интересно" то тебе надо было спрашивать не "где посмотреть
>как сделано в пхп" а "какие алгоритмы бывают и где их посмотреть" на что тебя
>вполне заслуженно пошлют гуглом
плагиатор =)

lifer
эту мантру следует повторять до достижения нирваны:
Google is my friend.
Google is my friend.
Google is my friend.
Google is my friend.
..
 
Сверху