Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: функция srand()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: функция srand()
KoDeRSmerT
Отправлено: 09 Февраля, 2013 - 12:19:18
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




привет. вот код.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. srand(2011);
  3. for($i=1; $i<10;$i++){
  4. $SDSFS=rand(0,5);
  5.     echo $SDSFS;
  6.     echo "<br>";
  7. }
  8.  
  9. ?>

как видите это генератор чисел. и выводит

3
0
0
3
0
2
0
1
4

у меня есть другая группа чисел сгенированные таким путем. и у меня вопрос. как получить значение srand() зная сгенированние нею чисел?

например

4
5
5
3
5
4
5
0
3

какое число надо написать в функцию srand() чтобы выводился такая группа чисел?


Отредактировано модератором: DeepVarvar, 09 Февраля, 2013 - 14:34:37
 
 Top
imya
Отправлено: 09 Февраля, 2013 - 14:31:34
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




Оберните код в соотв. теги, уважайте других форумчан.


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 09 Февраля, 2013 - 14:37:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




За сранд - зачем узнвать его число? Не возможно узнать. И вам это не нужно. Иначе что тогда это за почти случайное число?
Кроме того я могу нарулить это дело рандомизатора пыха на /dev/urandom и хрен вы чего подберете, т.к. коллизии будут минимальны.
 
 Top
KoDeRSmerT
Отправлено: 09 Февраля, 2013 - 19:31:24
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




есть такова. я уже сделал ) но мне нужна легкий способ. мой способ очень длинный. и скрипт работает медленно.
 
 Top
EuGen Администратор
Отправлено: 09 Февраля, 2013 - 19:51:53
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Это в общем случае невозможно. srand() в строгом смысле не является детерминированной, поэтому подозреваю, что "способ" состоит в переборе значений из некоторого диапазона, после чего получается некоторое число путем сравнения. Однако полученное число при подстановке никогда не будет давать один и тот же выходной набор при запуске произвольное число раз.
Поправка: из-за использования rand() набор будет генерироваться псевдослучайно, однако такое поведение является устаревшим. seed в этом случае будет давать детерминированный набор, однако такой метод генерации является устаревшим.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
KoDeRSmerT
Отправлено: 09 Февраля, 2013 - 19:58:25
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




esli zadona znaceniye srand() naprimer srand(2); to rand cisel pokazivayet odno i toje. znacit rand obrabativayetsya s pomosyu srand(). mojno prosta polucit perviye pyat cisel i sravnivat so vsemi srand() znaceniyami. i esli podxodit vivodit znaceniye srand()-a. tak vse rabotaet. no sravnivat vse znaceniya srand() ocen dolqo polucayetsya. no rabotaet.
 
 Top
DeepVarvar Супермодератор
Отправлено: 09 Февраля, 2013 - 20:59:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DeepVarvar пишет:
/dev/urandom и вы ничего не подберете
 
 Top
Stierus Супермодератор
Отправлено: 09 Февраля, 2013 - 21:56:49
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Я смотрю исходники пыха - функцию ранд и не втыкаю, почему она возвращает разные числа

сама функция выглядит следующим образом:


CODE (htmlphp):
скопировать код в буфер обмена
  1. PHP_FUNCTION(rand)
  2. {
  3.  long min;
  4.  long max;
  5.  long number;
  6.  int  argc = ZEND_NUM_ARGS();
  7.  
  8.  if (argc != 0 && zend_parse_parameters(argc TSRMLS_CC, "ll", &min, &max) == FAILURE)
  9.  return;
  10.  
  11.  number = php_rand(TSRMLS_C);
  12.  if (argc == 2) {
  13.   RAND_RANGE(number, min, max, PHP_RAND_MAX);
  14.  }
  15.  
  16.  RETURN_LONG(number);
  17. }


Возвращается number либо из RAND_RANGE либо из php_rand

CODE (htmlphp):
скопировать код в буфер обмена
  1. #define RAND_RANGE(__n, __min, __max, __tmax) \
  2.    (__n) = (__min) + (long) ((double) ( (double) (__max) - (__min) + 1.0) * ((__n) / ((__tmax) + 1.0)))


CODE (htmlphp):
скопировать код в буфер обмена
  1. PHPAPI long php_rand(TSRMLS_D)
  2. {
  3.  long ret;
  4.  
  5.  if (!BG(rand_is_seeded)) {
  6.   php_srand(GENERATE_SEED() TSRMLS_CC);
  7.  }
  8.  
  9. #ifdef ZTS
  10.  ret = php_rand_r(&BG(rand_seed));
  11. #else
  12. # if defined(HAVE_RANDOM)
  13.  ret = random();
  14. # elif defined(HAVE_LRAND48)
  15.  ret = lrand48();
  16. # else
  17.  ret = rand();
  18. # endif
  19. #endif
  20.  
  21.  return ret;
  22. }


srand запускается только в php_rand только при условии невыставленого флага rand_is_seeded, причем флаг в конце не сбрасывается, при генерации сиды с флагом тое ничего не присходит да и не может происходить:

CODE (htmlphp):
скопировать код в буфер обмена
  1. #ifdef PHP_WIN32
  2. #define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
  3. #else
  4. #define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
  5. #endif


CODE (htmlphp):
скопировать код в буфер обмена
  1. php_rand_r(unsigned int *ctx)
  2. {
  3.  u_long val = (u_long) *ctx;
  4.  *ctx = do_rand(&val);
  5.  return (int) *ctx;
  6. }

CODE (htmlphp):
скопировать код в буфер обмена
  1. do_rand(unsigned long *ctx)
  2. {
  3.  return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)PHP_RAND_MAX + 1));
  4. }

CODE (htmlphp):
скопировать код в буфер обмена
  1. PHPAPI void php_srand(long seed TSRMLS_DC)
  2. {
  3. #ifdef ZTS
  4. BG(rand_seed) = (unsigned int) seed;
  5. #else
  6. # if defined(HAVE_SRANDOM)
  7. srandom((unsigned int) seed);
  8. # elif defined(HAVE_SRAND48)
  9. srand48(seed);
  10. # else
  11. srand((unsigned int) seed);
  12. # endif
  13. #endif
  14.  
  15.  /* Seed only once */
  16.  BG(rand_is_seeded) = 1;
  17. }


за счет чего запускается сранд перед каждым рандом?
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 09 Февраля, 2013 - 23:17:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Я нашел вообще только в сухозине вот это:
CODE (ini):
скопировать код в буфер обмена
  1. ; Randomness
  2. ;suhosin.srand.ignore = on
  3. ;suhosin.mt_srand.ignore = on

Значит есть где-то место, через которое запускается сранд.
 
 Top
KoDeRSmerT
Отправлено: 09 Февраля, 2013 - 23:21:20
Post Id


Гость


Покинул форум
Сообщений всего: 109
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




ne znyu pocemu. no razniye cisla Голливудская улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB