Предположительно, вы также хотите, равномерное распределение по этому поводу расширенный область. Единственный способ, которым вы можете эффективно это сделать, - создать последовательность меньших чисел и масштабировать их так, как если бы вы работали в другой базе .Например, для 250000, вы можете 4 случайные числа в диапазоне [0,10) и один в диапазоне [0,25), вдоль линий:
int
random250000()
{
return randomInt(10) + 10 * randomInt(10)
+ 100 * randomInt(10) + 1000 * randomInt(10)
+ 10000 * randomInt(25);
}
Для этого, чтобы работать, ваш генератор случайных чисел должно быть хорошо; многие реализация rand()
не были (или, по крайней мере, не были — Я не проверил ситуацию недавно). Вы также захотите устранить смещение , которое вы получите, когда вы нанесете RAND_MAX + 1
различные значения в 10
или 25
разные значения. Если RAND_MAX + 1
не кратен 10
и 25
(например, является точным кратным 50
), вам нужно что-то как:
int
randomInt(int upperLimit)
{
int const limit = (RAND_MAX + 1) - (RAND_MAX + 1) % upperLimit;
int result = rand();
while (result >= limit) {
result = rand();
return result % upperLimit;
}
(Внимание при этом: есть некоторые машины, где RAND_MAX + 1
будет переполнение;., если портативность является проблемой, вам необходимо принять дополнительные меры предосторожности )
Все это, конечно, предполагает хорошее качество генератора, которое далеко от данность.
Продукт также не будет линейным. И последнее решение должно быть «a * (RAND_MAX + 1) + b'. (Он будет работать для случайных значений в диапазоне '[0, (RAND_MAX + 1) * (RAND_MAX + 1))', обеспечивая отсутствие переполнения. –
спасибо, я исправил его. – Heinzi
Большое спасибо! –