Проверить, принадлежит ли число, введенное с клавиатуры, интервалу 5 3 с
Обновлено: 23.11.2024
Равномерно распределенные случайные числа
Синтаксис
Описание
X = rand возвращает случайную скалярную величину, полученную из равномерного распределения в интервале (0,1).
X = rand( n ) возвращает матрицу n на n из равномерно распределенных случайных чисел.
X = rand( sz1. szN ) возвращает sz1 - by-. -by- szN массив случайных чисел, где sz1. szN указывают размер каждого измерения. Например, rand(3,4) возвращает матрицу 3 на 4.
X = rand( sz ) возвращает массив случайных чисел, где вектор размера sz определяет size(X) . Например, rand([3 4]) возвращает матрицу 3 на 4.
X = rand( ___ , typename ) возвращает массив случайных чисел типа данных typename . Ввод имени типа может быть "single" или "double". Вы можете использовать любой из входных аргументов в предыдущих синтаксисах.
X = rand( ___ ,"like", p ) возвращает массив случайных чисел, таких как p ; то есть того же типа данных и сложности (действительной или комплексной), что и p . Вы можете указать либо typename, либо «like», но не оба варианта одновременно.
X = rand( s , ___ ) генерирует числа из потока случайных чисел s вместо глобального потока по умолчанию. Чтобы создать поток, используйте RandStream. Вы можете указать s, за которым следует любая из комбинаций входных аргументов в предыдущих синтаксисе.
Примеры
Матрица случайных чисел
Создайте матрицу 5 на 5 из равномерно распределенных случайных чисел от 0 до 1.
Случайные числа в указанном интервале
Создайте вектор-столбец 10 на 1 из равномерно распределенных чисел в интервале (-5,5).
В общем случае можно сгенерировать N случайных чисел в интервале (a,b) по формуле r = a + (b-a).*rand(N,1) .
Случайные целые числа
Используйте функцию randi (вместо rand ), чтобы сгенерировать 5 случайных целых чисел из равномерного распределения от 10 до 50.
Сброс генератора случайных чисел
Сохраните текущее состояние генератора случайных чисел и создайте вектор случайных чисел 1 на 5.
Восстановите состояние генератора случайных чисел до s , а затем создайте новый вектор случайных чисел 1 на 5. Значения такие же, как и раньше.
Трехмерный массив случайных чисел
Создайте массив случайных чисел 3 на 2 на 3.
Укажите тип данных случайных чисел
Создайте вектор случайных чисел размером 1 на 4, элементы которого имеют одинарную точность.
Размер определяется существующим массивом
Создайте матрицу равномерно распределенных случайных чисел того же размера, что и существующий массив.
Обычно две предыдущие строки кода объединяются в одну строку:
Размер и тип данных определяются существующим массивом
Создайте матрицу 2 на 2 из случайных чисел одинарной точности.
Создайте массив случайных чисел того же размера и типа данных, что и p .
Случайные комплексные числа
Сгенерируйте 10 случайных комплексных чисел из равномерного распределения по квадратной области с действительной и мнимой частями в интервале (0,1).
Входные аргументы
n — Размер квадратной матрицы
целочисленное значение
Размер квадратной матрицы в виде целочисленного значения.
Если n равно 0 , то X — пустая матрица.
Если n отрицательное, то оно рассматривается как 0 .
Типы данных: одиночные | двойной | интервал8 | интервал16 | интервал32 | интервал64 | uint8 | uint16 | uint32 | uint64
Разм1. szN — Размер каждого измерения (как отдельные аргументы)
целочисленные значения
Размер каждого измерения в виде отдельных аргументов целочисленных значений.
Если размер любого измерения равен 0 , то X является пустым массивом.
Если размер какого-либо параметра отрицателен, он считается равным 0 .
Помимо второго измерения, rand игнорирует замыкающие измерения размером 1. Например, rand(3,1,1,1) создает вектор случайных чисел 3 на 1.
Типы данных: одиночные | двойной | интервал8 | интервал16 | интервал32 | интервал64 | uint8 | uint16 | uint32 | uint64
sz — Размер каждого измерения (в виде вектора-строки)
целочисленные значения
Размер каждого измерения в виде вектора-строки из целочисленных значений. Каждый элемент этого вектора указывает размер соответствующего измерения:
Если размер любого измерения равен 0 , то X является пустым массивом.
Если размер какого-либо параметра отрицателен, он считается равным 0 .
Помимо второго измерения, rand игнорирует замыкающие измерения размером 1. Например, rand([3 1 1 1]) создает вектор случайных чисел 3 x 1.
Пример: sz = [2 3 4] создает массив 2 на 3 на 4.
Типы данных: одиночные | двойной | интервал8 | интервал16 | интервал32 | интервал64 | uint8 | uint16 | uint32 | uint64
typename — тип данных (класс) для создания
"double" (по умолчанию) | "один"
Тип данных (класс) для создания, указанный как "double" , "single" или имя другого класса, обеспечивающего поддержку ранда.
Пример: rand(5,"single")
p — прототип массива для создания
числового массива
Прототип массива, чтобы создать в виде числового массива.
Пример: rand(5,"like",p)
Типы данных: одиночные | double
Поддержка сложных номеров: да
s — поток случайных чисел
объект RandStream
Поток случайных чисел в виде объекта RandStream.
Пример: s = RandStream("dsfmt19937"); ранд(с,[3 1])
Последовательность чисел, создаваемая функцией rand, определяется внутренними настройками универсального генератора псевдослучайных чисел, лежащего в основе rand , randi и randn . Вы можете управлять этим общим генератором случайных чисел с помощью rng .
Расширенные возможности
Генерация кода C/C++
Создайте код C и C++ с помощью MATLAB® Coder™.
Примечания и ограничения по использованию:
Тип данных (класс) должен быть встроенным числовым типом MATLAB®. Для других классов статический метод rand не вызывается. Например, rand(sz,'myclass') не вызывает myclass.rand(sz) .
Аргументы размера должны иметь фиксированный размер.
Если внешние вызовы включены и rand не вызывается внутри цикла parfor, сгенерированные файлы MEX используют то же состояние случайных чисел, что и MATLAB в последовательном коде. В противном случае сгенерированный код MEX и автономный код сохраняют свое собственное состояние случайных чисел, которое инициализируется в том же состоянии, что и MATLAB.
Среда на основе потоков
Выполнение кода в фоновом режиме с помощью MATLAB® backgroundPool или ускорение кода с помощью Parallel Computing Toolbox™ ThreadPool.
Эта функция полностью поддерживает среды на основе потоков. Для получения дополнительной информации см. раздел «Выполнение функций MATLAB в многопоточной среде».
Массивы графических процессоров
Ускорьте код, запустив его на графическом процессоре (GPU) с помощью Parallel Computing Toolbox™.
Примечания и ограничения по использованию:
Синтаксис потока rand( s ,___) не поддерживается графическим процессором.
Вы можете указать имя типа как 'gpuArray' . Если вы укажете typename как 'gpuArray' , базовым типом массива по умолчанию будет double .
Чтобы создать массив графического процессора с базовым типом данных type , укажите базовый тип в качестве дополнительного аргумента перед typename . Например, X = rand(3,datatype,'gpuArray') создает массив случайных чисел 3 на 3 графического процессора с базовым типом данных type .
Вы можете указать базовый тип данных одним из следующих параметров:
Вы также можете указать числовую переменную p как gpuArray .
Если указать p как gpuArray , базовый тип возвращаемого массива будет таким же, как у p .
Дополнительную информацию см. в разделе Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
Распределенные массивы
Разбейте большие массивы на разделы объединенной памяти вашего кластера с помощью Parallel Computing Toolbox™.
Примечания и ограничения по использованию:
Синтаксис потока rand( s ,___) не поддерживается для совместно распределенных или распределенных массивов.
Вы можете указать typename как "codistributed" или "distributed". Если вы укажете typename как 'codistributed' или 'distributed' , базовым типом возвращаемого массива по умолчанию будет double .
Чтобы создать распределенный или совместно распределенный массив с базовым типом datatype , укажите базовый тип в качестве дополнительного аргумента перед typename . Например, X = rand(3,datatype,'distributed') создает распределенную матрицу случайных чисел 3 на 3 с базовым типом данных type .
Вы можете указать базовый тип данных одним из следующих параметров:
Вы также можете указать p как совместно распределенный или распределенный массив.
Если указать p как совместно распределенный или распределенный массив, базовый тип возвращаемого массива будет таким же, как у p .
Дополнительные синтаксисы совместного распространения см. в разделе rand (совместное распространение) (Parallel Computing Toolbox) .
Дополнительную информацию см. в разделе Запуск функций MATLAB с распределенными массивами (Parallel Computing Toolbox).
История версий
R2022a: сопоставьте сложность с "like" и используйте "like" с объектом RandStream
Ввод "нравится" поддерживает как реальные, так и сложные массивы прототипов. Например:
Все синтаксисы поддерживают эту функцию. Кроме того, теперь вы можете использовать «like» с объектом RandStream в качестве первого ввода rand .
R2014a: Сопоставьте тип данных существующей переменной с «нравится»
Чтобы сгенерировать случайные числа с тем же типом данных, что и у существующей переменной, используйте синтаксис rand(__,'like',p) . Например:
R2013b: входные данные нецелого размера не поддерживаются
Ошибки, начиная с R2013b
Указание размера, который не является целым числом, вызывает ошибку. Используйте пол для преобразования входных данных нецелого размера в целые числа.
R2008b: входные данные "seed", "state" и "twister" не рекомендуются
Не рекомендуется начинать с R2008b
Мы не планируем удалять эти входные данные, управляющие генератором случайных чисел, лежащим в основе rand , randi и randn .Однако вместо этого рекомендуется использовать функцию rng по следующим причинам:
Генераторы "seed" и "state" имеют дефекты.
Термины "seed" и "state" являются вводящими в заблуждение названиями генераторов. «seed» относится к генератору MATLAB v4, а не к начальному значению инициализации. «состояние» относится к генераторам v5, а не к внутреннему состоянию генератора.
В этих трех входных данных нет необходимости использовать разные генераторы для rand и randn .
Производительность не имеет значения, но, пожалуйста, добавьте примечание о производительности к решениям, которые не являются O(1), так как люди могут копировать и вставлять предложения.
@Sergio: Я не чувствую себя педантичным. Я чувствую, что люди часто злоупотребляют методами расширения и другими инструментами языка, чтобы заменить и без того простые вещи. Существуют сотни способов сравнить два значения int, но использование чего-либо, кроме более очевидного, — плохой выбор, IMO.
32 Ответа 32
Есть много вариантов:
И действительно простой, если более элегантно можно написать с обратным порядком в первой проверке:
Кроме того, ознакомьтесь с этой записью SO, чтобы узнать о параметрах регулярных выражений.
Решение LINQ предназначено строго для точек стиля, так как содержит итерации по всем элементам, его сложность составляет O(range_size), а не O(1), как обычно ожидается при проверке диапазона.
Более общая версия для других диапазонов (обратите внимание, что вторым аргументом является количество, а не конец):
Enumerable.Range должен сначала сгенерировать перечисляемое целое число, а затем перебрать каждый элемент, чтобы найти его. Это ужасная идея, и производительность по сравнению с проверкой значения резко отличается. Я думаю, что нам следует принять девиз: то, что расширения LINQ — это круто, не означает, что их нужно использовать везде.
Я согласен, что это ужасная идея с точки зрения производительности, но OP хочет чего-то более причудливого, чем оператор if. Это, безусловно, достигает этого. ;)
Стоит отметить, что второй параметр не "стоп", а "количество". Так, например, Enumerable.Range(150, 300).Contains(400) вернет значение true.
Пожалуйста, не используйте этот ответ. Он будет иметь ужасную производительность, если ваши диапазоны довольно велики. См. ответ @olivier-jacot-descombes
Требуются граничные флаги, например InRange(number, LowerBound, LOWER_IS_INCLUSIVE , Upperbound, UPPER_IS_EXCLUSIVE), чтобы разрешить
В рабочем коде я бы просто написал
Это легко понять и легко прочитать.
Вот умный метод, который уменьшает количество сравнений с двух до одного с помощью некоторых математических вычислений. Идея состоит в том, что один из двух множителей становится отрицательным, если число лежит за пределами диапазона, и нулем, если число равно одному из пределов:
Если границы включают:
Если границы являются исключающими:
По моим стандартам, это, безусловно, самое элегантное решение, интересно то, что для меня оно также работает несколько быстрее, чем проверка обоих выражений, которые говорят, что оно также кажется более непоследовательным (скорость, кажется, варьируется больше) будет интересно узнать, проводилось ли какое-либо исследование того, какой из них быстрее.
Проверено ваше решение на javascript и его точность с числами с плавающей запятой до 14 знаков после запятой. Это очень хороший фрагмент кода. Если бы я мог, я бы проголосовал за вас трижды
Тем не менее, есть небольшая проблема, если задействованы большие положительные числа, это может привести к переполнению! XD Возможно, вы захотите помнить об этом при написании кода.
Вопрос требует элегантности и, следовательно, имеет скорее академическое, чем практическое значение. Лично я бы просто использовал простую 1 в продуктивном коде. Его легче понять.
Для тех, кто беспокоится о производительности, 1 (без && короткого замыкания) указывает компилятору, что он всегда может вычислить x независимо от результата 1 . Как ни странно (из-за предсказания ветвлений) быстрее всегда выполнять эту простую операцию, чем иногда ее пропускать.
Просто чтобы добавить шума, вы можете создать метод расширения:
Что позволит вам сделать что-то вроде этого.
При этом кажется глупым делать это, когда сам чек состоит всего из одной строки.
@Ben: я перешел к теме, в которой говорится «в пределах диапазона» (что, я не думаю, двусмысленно в этом отношении), но вы правы в том, что в тексте вопроса написано «от 1 до 100» (что, конечно, неоднозначно).
Как говорили другие, используйте простое условие if.
Вы должны подумать о порядке.
читается легче, чем
«Легче» — в глазах смотрящего. Лично я предпочитаю, чтобы рассматриваемая переменная находилась слева, а константа или переменная не — справа.
Сначала наиболее четким является числовой порядок, но вы можете натренировать свои глаза/ум на другие порядки. В частности, мне нравится всегда размещать константу слева. Если вы сделаете это, компилятор сообщит вам, когда вы набрали = вместо == .Он не помогает с реляционными операторами, не связанными с равенством, но к его постоянному использованию легко привыкнуть.
Я просто хочу добавить, что это решение бесполезно в любом случае. Предположим, что x является сложным вызовом функции или трудоемким выражением Linq. В этом случае вы сделаете это дважды, что не очень хорошо. Конечно, вы должны сохранить значение во временной локальной переменной, но в некоторых случаях (например, в операторах else-if) вы хотите вызывать функции только после того, как другие if или else-if не увенчались успехом. С временными переменными вы все равно должны вызывать их раньше. Метод расширения (упомянутый в других ответах) является лучшим решением в этих случаях.
и, конечно же, с переменными:
Он легко читается (близок к человеческому языку) и работает с любыми сопоставимыми типами (целочисленными, двойными, пользовательскими типами. ).
Чтобы код был легко читаемым, важно, потому что разработчик не будет тратить «мозговые циклы», чтобы понять его. При длительных сеансах кодирования трата мозговых циклов приводит к тому, что разработчик быстрее устает и подвержен ошибкам.
я бы еще больше упростил, используя слово "между" и логический флаг, определяющий, является ли он инклюзивным или нет
Хорошо. Это легко понять. Я изменил имя IsInRange. Я не в восторге от инклюзивного логического значения Бена, поскольку для этого требуется еще несколько мозговых циклов. Его преимущество в том, что его можно использовать в любом классе, реализующем IComparer. Теперь это в моих расширениях вместе с LiesWithin/LiesInside. Только не могу решить какой. NotOutside подойдет, но я не люблю негативные условия
Несколько злоупотребив методом расширения, мы можем получить следующее "элегантное" решение:
Понравилось решение! Кстати, для поддержки включительно создайте перечисление Inclusive со значениями: Lower , Upper , All . И передайте для функции In один дополнительный параметр типа enum Inclusive со значением по умолчанию Inclusive.All , обновите тело функции To для обработки значений All , Lower , Upper :)
Если это случайно, простое если это все, что вам нужно. Если это происходит во многих местах, вы можете рассмотреть эти два:
-
. Украсьте методы атрибутами, которые «внедряют» код в метод после компиляции. Я не знаю точно, но я могу представить, что его можно использовать для этого.
-
. Имеет то преимущество, что ограничения можно проверить во время компиляции путем статической проверки вашего кода и мест, где он используется.
+1 для кодовых контрактов; она специфична для проверки параметра, но часто используется, и статическая проверка может оказаться чрезвычайно полезной.
Использование выражения && для объединения двух сравнений — самый элегантный способ сделать это. Если вы попытаетесь использовать причудливые методы расширения и тому подобное, вы столкнетесь с вопросом о том, следует ли включать верхнюю границу, нижнюю границу или и то, и другое. Как только вы начнете добавлять дополнительные переменные или изменять имена расширений, чтобы указать, что включено, ваш код станет длиннее и труднее для чтения (для подавляющего большинства программистов). Кроме того, такие инструменты, как Resharper, предупредят вас, если ваше сравнение не имеет смысла (число > 100 && число), чего они не сделают, если вы используете метод ('i.IsBetween(100, 1)'). р>
Единственный другой комментарий, который я хотел бы сделать, заключается в том, что если вы проверяете входные данные с намерением создать исключение, вам следует рассмотреть возможность использования контрактов кода:
Это более элегантно, чем if(. ) throw new Exception(. ) , и вы даже можете получить предупреждения во время компиляции, если кто-то попытается вызвать ваш метод, не убедившись, что число находится в границах.
К вашему сведению, статический анализатор контрактов работает лучше, когда нижняя граница и верхняя граница разделены на отдельные операторы Requires.
Спасибо, Дэн Брайант, это именно то, что я искал. Не удается найти много материалов о предложениях по стилю условий для Requires и других связанных методов Code Contract.
Мой первоначальный ответ: я бы выбрал более простую версию:
Лучший способ
Поскольку я не видел другого более эффективного решения (по крайней мере, согласно моим тестам), попробую еще раз.
Новый и улучшенный способ, который также работает с отрицательными диапазонами:
Это можно использовать как с положительными, так и с отрицательными диапазонами, и по умолчанию используется диапазон
1..100 (включительно) и использует x в качестве числа для проверки, за которым следует необязательный диапазон, определяемый min и max .
Добавление примеров для хорошей оценки
Пример 2. Использование списка из 100 000 случайных целых чисел от 1 до 150
Да, я комментирую комментарий к моему ответу от 2013 года :) @RyanTheLeach: Чем мой ответ на этот вопрос отличается от «принятого» ответа? Я понимаю, что это не самый эффективный обход, но «ужасный»? Насколько плохим может быть выделение и перебор 100 целых чисел? В 1950 году это, вероятно, не было принято обществом, но.
@RyanTheLeach Я не виню тебя. Я обновил свой ответ, поэтому, если вы знаете о еще более эффективном решении, пожалуйста, уточните!
Использование
двойное числоToBeChecked = 7;
var result = numberToBeChecked.IsBetween(100,122);
var result = 5.IsBetween(100,120);
var result = 8.0.IsBetween(1.2,9.6);
Вот некоторые методы расширения, которые могут помочь
Если вы хотите написать больше кода, чем простое если, возможно, вы можете: Создайте метод расширения с именем IsBetween
Пользовательские функции
Как следует из названия, эти функции определяются и создаются пользователями. Функции в C++ согласуются с понятием функций в математике. Например, они допускают функциональную композицию, такую как f(f(p),q,f(f)). Однако функции C++ либо возвращают одно значение, либо не возвращают никакого значения. Рассмотрим следующий пример. Это определяемая пользователем функция, которая вычисляет значение факториала небольшого целого числа.
Целочисленная переменная n является входом функции и также называется параметром функции.
Если функция определена после функции main(), то ее прототип должен быть указан int fact (int);
вверху, чтобы компилятор не помечал ошибку прямой ссылки. В определении прототипа указывается имя функции, количество и тип каждого параметра, а также тип выходных данных.
Все фрагменты кода, такие как прототип функции, вызывающая основная программа и полное определение функции, показаны ниже
Обычные результаты выполнения этого кода показаны ниже:
Примеры функций
Пример 1
Напишите функцию для определения максимума двух целых чисел x и y. Ответ:
Эта функция принимает на вход два целых числа x и y. Он выбирает x как результат, если x больше, чем y; в противном случае для результата выбирается y.
Пример 2:
Напишите функцию, которая находит максимальное из трех целых чисел x, y и z. Ответ:
Чтобы начать с x, предполагается, что это результат. Затем результат сравнивается с y и z. если y или z больше, чем результат, y или z выбирается для результата соответственно.
Одна и та же функция может состоять из функции max2, как показано ниже:
Этот расчет показывает использование функциональной композиции max(x, y, z) = max(x, max(y,z))
Пример 3
Напишите функцию, которая возвращает количество трехзначных натуральных чисел, которые делятся либо на 4, либо на 5, но не на оба числа.
Ответ: эта функция сначала просматривает все возможности для трехзначных чисел, затем проверяет, делится ли это текущее значение «i» на 4 ИЛИ 5, и в то же время проверяет, не является ли оно двойным подсчетом другого числа. .
Пример 4
Напишите функцию, которая будет возвращать истину, если заданное число n является простым, иначе она должна возвращать ложь.
Ответ: Эта функция проверяет все делители от 2 до n/2 -1 включительно. Он выйдет заранее, если найдет делитель до завершения цикла. Если код завершает цикл, это означает, что число не имеет делителя и, следовательно, является простым числом.
Пример 5
Напишите функцию, которая будет возвращать true, если заданное число является палиндромом, в противном случае она должна возвращать false. Число называется палиндромом, если оно читается одинаково независимо от того, просматривается ли оно слева направо или наоборот. Например, 506605 — это палиндром, а 5123 — нет.
Ответ: Логика палиндрома состоит в том, чтобы перевернуть заданное число n. Это делается циклом while. Заданное число n является палиндромом тогда и только тогда, когда исходное n и его обращение идентичны.
Если задано значение шага, оно будет использоваться как приращение (или уменьшение) между элементами в последовательности. шаг не должен быть равен 0 и не должен превышать указанный диапазон. Если не указано, по умолчанию шаг будет равен 1.
Возвращаемые значения
Возвращает массив элементов от начала до конца включительно.
Примеры
// массив (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
foreach (диапазон (0, 12) как $number) echo $номер ;
>
// Параметр шага
// array(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
foreach ( range ( 0 , 100 , 10 ) как $number ) echo $number ;
>
// Использование последовательностей символов
// array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', ' я');
foreach (диапазон ('a', 'i') как $letter) echo $letter;
>
// массив('c', 'b', 'a');
foreach ( диапазон ( 'c' , 'a' ) как $letter ) echo $letter ;
>
?>
Примечания
Примечание.
Значения последовательности символов ограничены единицей длины. Если введена длина больше единицы, используется только первый символ.
См. также
- shuffle() — перетасовка массива
- array_fill() — заполнение массива значениями
Примечания, внесенные пользователями 29 примечаний
Чтобы создать массив диапазонов, например
объединить два массива диапазонов с помощью array_combine:
Функция сгенерирует массив целых чисел, даже если ваши числовые параметры заключены в кавычки.
(диапазон ('1', '2')); // выводит массив(2) < [0]=>int(1) [1]=> int(2) >
?>
Простой способ получить массив строк состоит в том, чтобы сопоставить strval() с диапазоном:
( array_map ('strval', range ('1', '2'))); // выводит массив(2) < [0]=>строка(1) "1" [1]=> строка(1) "2" >
?>
Если вы хотите заполнить массив, чтобы получить хеш с числовыми значениями от 0 до 9, использование
range(0,9);
является более быстрым решением по сравнению с
array_fill (0, 10, '');
Чтобы создать простой массив или многомерный массив с определенным размером и нулевыми значениями, используйте это выражение:
= array_map (функция ($n) < return null; >, диапазон (1, 3));
$MultiArray = array_map (функция ($n) < return array_map (функция ($n) < return null; >, диапазон (1, 2)); >, диапазон (1, 3));
var_dump ( $SimpleArray );
var_dump ($MultiArray);
Поэтому с введением односимвольных диапазонов в функцию range() внутренняя функция пытается быть "умной" и (здесь я делаю вывод из поведения), по-видимому, проверяет тип входящих значений. Если один является числовым, включая числовую строку, то другой обрабатывается как числовой; если это нечисловая строка, она обрабатывается как ноль.
Если вы передаете числовую строку таким образом, что она принудительно распознается как строка типа, а не числовой тип, range() будет работать совсем по-другому.
эхо взрывается ("" , диапазон ( 9 , "Q" ));
// печатает 9876543210
эхо взрывается ("" , диапазон ("9 " , "Q" )); //пробел после 9
// печатает 9:; ?@ABCDEFGHIJKLMNOPQ
echo implode( "" , range( "q" , "9 " ));
// печатает qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@ ?> =
Я бы не назвал это ошибкой, потому что, по моему мнению, это даже полезнее, чем стандартное использование функции.
Функция range очень полезна для получения массива символов, как это делает range('C','R').
На работе мне пришлось расширить функцию range($a,$b), чтобы она работала в этом особом случае: с двумя строками в верхнем регистре $a и $b она должна возвращать все возможные строки между $a и $b. .
Это можно использовать, например, для получения индексов столбцов Excel.
например, ('A', 'AD') ==> array('A', 'B', 'C'. 'Z', 'AA', 'AB', 'AC', 'AD') ?>
Поэтому я написал функцию getrange($min,$max), которая делает именно это.
функция getcolumnrange ($min, $max) $pointer = strtoupper ($min);
$output =массив();
while(positionalcomparison($pointer, strtoupper($max)) 0) array_push($output, $pointer);
$указатель++;
>
возврат $output ;
>
функция позиционного сравнения ($a, $b) $a1 = stringtointvalue ($a); $b1 = значение stringtointvalue ( $b );
если($a1 > $b1)возврат 1;
иначе если( $a1 $b1 )возврат - 1 ;
иначе вернуть 0 ;
>
/*
* например. A=1 - B=2 - Z=26 - AA=27 - CZ=104 - DA=105 - ZZ=702 - AAA=703
*/
функция stringtointvalue ( $str ) $amount = 0 ;
$strarra = array_reverse ( str_split ( $str ));
for( $i = 0 ; $i strlen ( $str ); $i ++) $amount +=( ord ( $strarra [ $i ])- 64 )* pow ( 26 , $i );
>
возврат $amount ;
>
?>
foreach(range()) эффективен в других языках, таких как python, но не (по сравнению с for) в php*.
php — это язык, вдохновленный C, и поэтому он полностью соответствует эстетике языка для его использования
//эффективность
for( $i = $start ; $i $end ; $i += $step )
// что-то сделать с массивом
>
//неэффективно
foreach( range ( $start , $end , $step ) as $i )
// что-то делать с массивом
>
?>
То, что в официальной документации не упоминается цикл for, странно.
Обратите внимание, однако, что в PHP5 foreach выполняется быстрее, чем for, при итерации без увеличения переменной.
* Мои тесты с использованием микровремени и 100 000 последовательных итераций (~10 раз) показывают, что for в 4 раза быстрее, чем foreach(range()).
функция natural_prime_numbers (массив $range, bool $print_info = false) : array <
$start_time = time ();
$primes_numbers = array();
$print = '' ;
$count_range = количество ( $range );
foreach($range as $number) <
$values_division_number = array();
if( $number === 0 || $number === 1 || ! is_int ( $number )) < // исключаем 0, 1 и другие нецелые числа
continue;
>
if( $number != 2 && $number % 2 === 0 ) < // исключить 2 и пары чисел
continue;
>
for( $i = 1 ; $i $number ; $i ++) <
$resultado_divisao = $number / $i ;
$values_division_number [ $i ] = $resultado_divisao ;
if( $count_range 20 ) < // $count_range $print .= PHP_EOL ;
$info = 'Число' . $ число . 'делить на число'. $я. ' равно: ' .($number / $i);
$print .= $info ;
if( $i === $number ) $print .= PHP_EOL ;
>
>
$values_division_number = массив_значений ( $values_division_number ); // переиндексировать массив
// здесь нам нужен только массив с 2 индексами со значениями 1 и собственным числом (правило до натурального простого числа)
if( count ( $values_division_number ) === 2 && $values_division_number [ 0 ] = == $number && $values_division_number [1] === 1) $primes_numbers [$number] = $number;
>
>
>
вернуть массив(
'length_prime_numbers' => count ( $primes_numbers ),
'prime_numbers' => array_values ( $primes_numbers ),
'print' => $print,
'total_time_processing' => (time () - $start_time). 'seconds.',
);
>
var_dump ( natural_prime_numbers (диапазон ( 0 , 11 ))); // здесь функция range() ;-)
// Результат:
// массив (размер=3)
// 'length_prime_numbers' => int 5
// 'prime_numbers' =>
// массив (size=5)
// 0 => int 2
// 1 => int 3
// 2 => int 5
// 3 => int 7 < br />// 4 => int 11
// 'print' => string '
// O número 2 dividido pelo número 1 é igual a: 2
// O número 2 Dividido pelo número 2 é igual a: 1
// O número 3 dividido pelo número 1 é igual a: 3
// O número 3 dividido pelo número 2 é igual a: 1.5
// O número 3 dividido pelo número 3 é igual а: 1
// O número 5 dividido pelo número 1 é igual a: 5
// O número 5 dividido pelo número 2 é igual a: 2.5
// O número 5 dividido pelo número 3 é igual a: 1.6666666666667
// O número 5 dividido pelo número 4 é igual a: 1.25
// O número 5 dividido pelo '.
// ******************************* //
//
// * Помните, что функция является рекурсивной, то есть: диапазон 5000 занимает более 1 минуты на процессоре Intel® Core™ i5-8250U (3,40 ГГц).
//
// ******************************* //
?> р>
Читайте также: