Nano Hash - криптовалюты, майнинг, программирование

Случайное число с плавающей запятой от 0 до 1,0 php

<Сильные> Возможные дубликаты:
Случайное поплавок в PHP

Можно ли создать случайный номер поплавка от 0 до 1,0 е.г 0,4, 0,8 и т. Д. Я использовал Rand, но он принимает только целые числа.


  • Существует официальный пример для этого в Руководство PHP для mt_getrandmax 04.01.2013
  • Плохо, мельком посмотрел, но не наткнулся на этот вопрос 04.01.2013
  • Смотрите также: Stackoverflow.com/a/47190869/89818 09.11.2017
  • Почему бы просто сделать это просто. Рэнд (0,1) ... Rand (0,100) 01.07.2021

Ответы:


1
mt_rand() / mt_getrandmax();

Избегайте функции rand(), поскольку обычно она зависит от реализации платформы C rand(), в целом создавая числа с очень простым рисунком. Смотрите Этот комментарий на php.net

Обновление : в php 7.1 rand() был изменен и теперь является просто псевдонимом mt_rand(). Поэтому теперь можно использовать и rand().

04.01.2013
  • Или, чтобы более соответственно имитировать 0,0 включительно до 1,0 эксклюзивной природы того, что я считаю стандартной рандомизации, используйте mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax() 25.01.2013
  • См. stackoverflow.com/a/47190869/89818 версию, которая поддерживает как инклюзивный, так и эксклюзивный вариант. 09.11.2017
  • В PHP 7.0 rand используйте тот же генератор, что и mt_rand. Однако есть другое поведение со значениями аргументов, когда max меньше min. 08.01.2018

  • 2

    Как насчет просто разделить на 10?

    $randomFloat = rand(0, 10) / 10;
    var_dump($randomFloat);
    
    //eg. float(0.7)
    
    04.01.2013
  • Ну, это будет только 1 из 10 возможных вариантов, не очень места для случайности там 04.01.2013
  • @Dracony ОП, казалось, хотел только 1 десятичный знак. Конечно, любой номер может быть выбран (rand(0, 10000) / 10000), чтобы вызвать больше десятичных действий и, следовательно, больше случайности. 04.01.2013
  • @Dracony, h2oooooo: быть педантичным, количество случайности не меняется ... 04.01.2013
  • @Olicharlesworth, конечно, вы правы - это так же случайно, но имеет больше десятичных действий. 04.01.2013
  • @Dracony: ... и теперь у вас есть мой ответ :-) Stackoverflow.com/Questions/14155603/ 16.02.2013

  • 3
    $v = mt_rand() / mt_getrandmax();
    

    сделаю это.


    Если вы хотите только одно десятичное место (как в примерах от вопроса) просто round() Значение, которое вы получаете ...

    $v = round( $v, 1 );
    

    ... или рассчитать число от 0 до 10 и разделить на 10:

    $v = mt_rand( 0, 10 ) / 10;
    
    04.01.2013

    4

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

    С учетом сказанного, вот функция, которая использует это для генерации случайного числа с плавающей запятой между двумя числами:

    function random_float($min, $max) {
        return random_int($min, $max - 1) + (random_int(0, PHP_INT_MAX - 1) / PHP_INT_MAX );
    }
    

    Хотя random_int() более безопасна, чем mt_rand(), имейте в виду, что она также медленнее.

    Предыдущая версия этого ответа предлагала вам использовать PHP rand() и имела ужасную реализацию. Я хотел изменить свой ответ, не повторяя то, что другие уже говорили, и теперь здесь мы.

    04.01.2013
  • Результат не будет равномерно распределен, поскольку 1,0 будет иметь проводимость 0,5. Кроме того, вы получите только разрешение 0,1. 04.01.2013
  • Взял меня некоторое время. Несколькими годами позже. Это лучше? 25.10.2017

  • 5

    Как насчет этого простого решения:

    abs(1-mt_rand()/mt_rand()) 
    

    or

    /**
     * Generate Float Random Number
     *
     * @param float $Min Minimal value
     * @param float $Max Maximal value
     * @param int $round The optional number of decimal digits to round to. default 0 means not round
     * @return float Random float value
     */
    function float_rand($Min, $Max, $round=0){
        //validate input
        if ($min>$Max) { $min=$Max; $max=$Min; }
            else { $min=$Min; $max=$Max; }
        $randomfloat = $min + mt_rand() / mt_getrandmax() * ($max - $min);
        if($round>0)
            $randomfloat = round($randomfloat,$round);
    
        return $randomfloat;
    }
    
    04.01.2013
  • При использовании работы других людей, пожалуйста, всегда ссылайтесь на свои источники. ivankristianto.com/ Спасибо! 04.12.2013
  • В коде есть ошибка: эти строки: если ($ min > $ max) {$ min = $ max; $ max = $ min; } Должно быть: if ( $Min ›$Max) { $min=$Max; $ max = $ min; } 05.02.2014
  • Кроме того, нет необходимости гарантировать, что $Min < $Max — их перестановка дает математически идентичное распределение вероятностей… 15.12.2015
  • Первое решение недействительно. Разделив две независимые равномерно распределенные случайные величины, вы получите равномерное распределение отношений (хотя компьютеры всегда дискретны; это приближение). Смотрите en.wikipedia.org/wiki/ratio_distribution. Существует вероятность 1/4, что он вернет число больше единицы (и может вернуть числа любого размера с вероятностью, уменьшающейся как квадрат числа). Единое распределение соотношения больше не равномерно распределено. 17.05.2017

  • 6

    Попробуй это

    // Generates and prints 100 random number between 0.0 and 1.0 
    $max = 1.0;
    $min = 0.0;
    for ($i = 0; $i < 100; ++$i)
    {
        print ("<br>");
        $range = $max - $min;
        $num = $min + $range * (mt_rand() / mt_getrandmax());    
        $num = round($num, 2);
        print ((float) $num);
    }
    
    17.01.2013

    7

    Отбрасывать, чтобы поплавок * и разделить getrandmax().


    * Кажется, что в правилах произвольного жонглирования типами PHP нет необходимости в приведении типов. Это было бы на других языках, хотя.

    04.01.2013
  • Правила не являются произвольными. 12.06.2014
  • @ Fuser97381: Может быть, и не произвольно, но, безусловно, создано как серия специальных запоздалых размышлений, что привело к неприятному, непоследовательному набору правил. 12.06.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование