Это странно для меня. Я уверен, что скоро буду привыкать к этому, но я просто хочу знать, почему это так.Почему minValue включительно, но maxValue эксклюзивно для Random.Next()?
ответ
Причина 1) maxValue - minValue
дает число возможных элементов в диапазоне, так что вы можете использовать такой код:
var randomItemFromArray = MyArray[random.Next(0, MyArray.Length)];
Чтобы сделать это, если верхняя граница была включительно будет выглядеть немного неуклюжим/нечетным.
Причина 2) Легче кода
Причина 3) Она обеспечивает равномерное распределение возможностей при использовании с плавающей точкой -
Смотрите Exclusive upper bound in random number range для получения дополнительной информации
Представьте, что у вас есть несколько диапазоны, например
- Запускает от 0
- Запускают от 100 (диапазона интереса)
- Запускает из (следующего диапазона) 500
- Запускает от 1000
и мы должны получить случайное значение от 2-го диапазона, все, что мы должны сделать
random.Next(100, 500);
ie 1st ar gument - пуск диапазона, а второй - следующий начало диапазона; это очень удобно, если диапазон complex: все, что мы должны знать, где начинается каждый диапазон (нам не нужно вычислять точная включенная верхняя граница, но может сказать «вверх, но не включая следующий диапазон») , Например. мы хотим получить случайный момент (до второго) в феврале 2016 года:
DateTime start = new DateTime(2016, 2, 1);
// Please notice how much easier it is to put "1 Mar" than "29 Feb 23:59:59"
DateTime startNext = new DateTime(2016, 3, 1);
// Please notice: just subtraction
DateTime random = start +
TimeSpan.FromSeconds(random.Next((startNext - start).TotalSeconds));