Генерация случайных чисел (1-100) отображает только 1 номер [дубликат]

Этот ресурс также стоит рассмотреть - некоторый очень аккуратный код, который использует GD. Тем не менее, я изменил их окончательный фрагмент кода для создания этой функции, которая соответствует требованиям OP ...

function store_uploaded_image($html_element_name, $new_img_width, $new_img_height) {

    $target_dir = "your-uploaded-images-folder/";
    $target_file = $target_dir . basename($_FILES[$html_element_name]["name"]);

    $image = new SimpleImage();
    $image->load($_FILES[$html_element_name]['tmp_name']);
    $image->resize($new_img_width, $new_img_height);
    $image->save($target_file);
    return $target_file; //return name of saved file in case you want to store it in you database or show confirmation message to user

}

Вам также потребуется включить этот файл PHP ...

image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image,$filename);
      }
      if( $permissions != null) {

         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }
   function getWidth() {

      return imagesx($this->image);
   }
   function getHeight() {

      return imagesy($this->image);
   }
   function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }      

}
?>

42
задан Dan D. 29 April 2012 в 04:48
поделиться

12 ответов

Вы должны засеять его. Хорошая идея:

srand()

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  srand ( time(NULL) );
  printf ("Random Number: %d\n", rand() %100);
  return 0;
}

Вы получаете одну и ту же последовательность, потому что rand () автоматически высевается с помощью значение 1, если вы не вызываете srand ().

Редактировать

Из-за комментариев

rand() будет верните число между 0 и RAND_MAX (определенное в стандартной библиотеке). Использование оператора modulo (%) дает остаток от деления rand()/100. Это заставит случайное число находиться в диапазоне 0-99. Например, чтобы получить случайное число в диапазоне от 0 до 999, мы применили бы rand()%1000.

73
ответ дан kjfletch 5 September 2018 в 07:12
поделиться

Цитата из man rand :

Функция srand () задает свой аргумент как семя для новой последовательности псевдослучайных целых чисел, которую нужно вернуть Rand (). Эти последовательности повторяются, вызывая srand () с тем же начальным значением.

Если не задано начальное значение, функция rand () автоматически высевается со значением 1.

Итак, без начального значения rand () принимает семя как 1 (каждый раз в вашем случае) и с тем же начальным значением, rand () будет производить ту же последовательность чисел.

18
ответ дан Aditya Sehgal 5 September 2018 в 07:12
поделиться

Здесь много ответов, но никто, кажется, действительно не объяснил, почему именно rand () всегда генерирует одну и ту же последовательность с тем же семенем - или даже то, что семя действительно делает. Итак, здесь идет.

Функция rand () поддерживает внутреннее состояние. Понятно, что это можно рассматривать как глобальную переменную некоторого типа rand_state. Каждый раз, когда вы вызываете rand (), он выполняет две вещи. Он использует существующее состояние для вычисления нового состояния и использует новое состояние для вычисления числа, возвращаемого вам:

state_t rand_state = INITIAL_STATE;

state_t calculate_next_state(state_t s);
int calculate_return_value(state_t s);

int rand(void)
{
    rand_state = calculate_next_state(rand_state);
    return calculate_return_value(rand_state);
}

Теперь вы можете видеть, что каждый раз, когда вы вызываете rand (), это собирается сделать rand_state перемещаться на один шаг по заранее определенному пути. Случайные значения, которые вы видите, основаны только на том, где вы находитесь по этому пути, поэтому они также будут следовать заранее определенной последовательности.

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

state_t generate_random_state(unsigned int seed);

void srand(unsigned int seed)
{
    rand_state = generate_random_state(seed);
}

Точные детали state_t, calculate_next_state (), calculate_return_value () и generate_random_state () могут варьироваться от платформы к платформе, но они обычно довольно просты.

Вы можете видеть из этого, что каждый раз, когда запускается ваша программа, rand_state будет начинаться с INITIAL_STATE (что эквивалентно generate_random_state (1)) - вот почему вы всегда получаете одну и ту же последовательность, если вы 't использовать srand ().

9
ответ дан caf 5 September 2018 в 07:12
поделиться

rand () возвращает следующее (псевдо) случайное число в ряду. Что происходит, вы имеете одну и ту же серию каждый раз при ее запуске (по умолчанию «1»). Чтобы засеять новую серию, вы должны вызвать srand (), прежде чем вы начнете вызывать rand ().

Если вы хотите что-то случайное каждый раз, вы можете попробовать:

srand (time (0));
2
ответ дан Chet 5 September 2018 в 07:12
поделиться

Генераторы случайных чисел на самом деле не случайны, они, как и большинство программ, полностью предсказуемы. То, что делает rand, создает различное псевдослучайное число каждый раз, когда оно называется One, которое кажется случайным. Чтобы правильно использовать его, вам нужно дать ему другую отправную точку.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  /* initialize random seed: */
  srand ( time(NULL) );

  printf("random number %d\n",rand());
  printf("random number %d\n",rand());
  printf("random number %d\n",rand());
  printf("random number %d\n",rand());

  return 0;
}
7
ответ дан Dave Sherohman 5 September 2018 в 07:12
поделиться
0
ответ дан dfa 5 September 2018 в 07:12
поделиться

Кстати: факт, что rand НЕ случайный (PRNG = PSEUDO Random Number Generator, где псевдо - ключевое слово!) может быть очень полезным.

Если тот же алгоритм используется на компьютерах по сети, и если некоторые данные (например, состояние игры) вычисляются с использованием «случайных» чисел и если код на всех машинах синхронизирован, так что вызов rand вызывается в одном и том же месте / времени всеми клиентами, тогда вы можете уменьшить нагрузку на сеть, регенерируя данные / события / независимо от места.

Псевдо-случайный - это прекрасная вещь. :)


PS Если вы когда-либо полагаетесь на синхронизированный rand (om), вы должны закодировать свою собственную реализацию - иначе платформа и другие различия испортят ваше удовольствие. :)

0
ответ дан fullreset 5 September 2018 в 07:12
поделиться

Никто из вас, парни, не отвечает на его вопрос.

с этим кодом я получаю одну и ту же секвенцию каждый раз, но код генерирует случайные последовательности, если я добавляю srand (/ somevalue /) перед циклом for. может кто-нибудь объяснить, почему?

Из того, что сказал мне мой профессор, он используется, если вы хотите убедиться, что ваш код работает правильно и посмотреть, есть ли что-то не так, или если вы можете что-то изменить.

0
ответ дан James 5 September 2018 в 07:12
поделиться

Это из http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#rand :

Объявление:

void srand(unsigned int seed); 

Эта функция сгенерирует генератор случайных чисел, используемый функцией rand. Выселение srand с тем же семенем приведет к тому, что rand вернет ту же последовательность псевдослучайных чисел. Если srand не вызывается, rand действует так, как будто srand (1) был вызван.

2
ответ дан Key 5 September 2018 в 07:12
поделиться

Присадка rand()

void srand (unsigned int seed)

Эта функция устанавливает семя в качестве семени для новой серии псевдослучайных чисел. Если вы вызываете rand до того, как семя было установлено с srand, оно использует значение 1 в качестве семени по умолчанию.

Чтобы создать различную псевдослучайную последовательность при каждом запуске вашей программы, сделайте srand (time (0))

0
ответ дан nik 5 September 2018 в 07:12
поделиться

rand () возвращает псевдослучайные числа. Он генерирует числа, основанные на заданном алгоритме. Начальная точка этого алгоритма всегда одна и та же, поэтому вы увидите ту же последовательность, сгенерированную для каждого вызова. Это удобно, когда вам нужно проверить поведение и последовательность вашей программы.

Вы можете установить «семя» случайного генератора с помощью функции srand (только один раз вызов srand в программе). Один общий способ получения разных последовательностей из генератора rand () - установить начальное значение на текущее время или идентификатор процесса:

srand (время (NULL)); или srand (getpid ()); в начале программы.

Создание реальной случайности очень сложно для компьютера, но для практической работы, не связанной с криптографией, алгоритм, который пытается равномерно распределить созданные последовательности, отлично работает.

32
ответ дан nos 5 September 2018 в 07:12
поделиться

Если я помню цитату из семантической работы Кнута «Искусство компьютерного программирования» в начале главы о генерации случайных чисел, она выглядит следующим образом:

«Любой, кто пытается генерировать случайные числа математически означает, технически говоря, состояние греха ».

Проще говоря, генераторы случайных чисел являются алгоритмами, математическими и на 100% предсказуемыми. Это действительно хорошо во многих ситуациях, где желательна повторяемая последовательность «случайных» чисел - например, для определенных статистических упражнений, где вы не хотите «колебаться» в результатах, которые действительно случайные данные вводят благодаря кластерные эффекты.

Хотя захват бит «случайных» данных с аппаратного обеспечения компьютера является популярной второй альтернативой, это также не является случайным - хотя, чем сложнее операционная среда, тем больше возможностей для случайности - или наименьшая непредсказуемость.

Поистине генераторы случайных данных имеют тенденцию смотреть на внешние источники. Радиоактивный распад является фаворитом, как и поведение квазаров. Все, чьи корни находятся в квантовых эффектах, является фактически случайным - во многом до раздражения Эйнштейна.

9
ответ дан Tim H 5 September 2018 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: