рода проблемы, я имею дело с включает в себя несколько вещей, а именно:интервалы отбора проб, а не числа, без замены
- Мне нужно, чтобы случайно выборки чисел из диапазона чисел.
- Этот диапазон чисел действительно огромный, от 1 до 1 000 000 000.
- Мне нужен процесс выборки, чтобы избежать выборки из интервалов в пределах диапазона, который уже был выбран. Поскольку использование массива слишком медленное, мои попытки использовать
splice
не собираются работать.
Начну с выбора номера от 1 до 1 000 000 000.
my $random = int(rand(1_000_000_000)) + 1;
добавить значение, скажем, 100, к тому, чтобы сделать $random
и $random + 100
определить интервал.
my $interval = $random + 100;
Тогда я push
как $random
и $interval
в другой массив. Этот другой массив должен хранить интервалы.
push (@rememberOldIntervals, $random, $interval);
я шаг через массив @rememberOldIntervals
используя for
петли, потянув элементы в паре. Первая из пары - прежняя $random
, а другая - $interval
. Внутри этого цикла for
я делаю еще одно случайное число. Но сгенерированное число не может быть между уже выполненным интервалом. Если да, держите выборку до тех пор, пока не будет найдено число, которое является уникальным. Кроме того, это новое случайное число должно быть не менее 100 от любого старого интервала.
for (my $i= 0; $i < (scalar @rememberOldIntervals)/2 ; $i=+2) {
$random = int(rand(1_000_000_000)) + 1;
my $new_random_low = $random - 100;
my $new_random_high = $random + 100;
if ($new_random_low <= $rememberOldIntervals[0] OR
$new_random_high >= $rememberOldIntervals[1] ){
push(@rememberOldIntervals, $new_random_low, $new_random_high);
}
else {
until ($new_random_low <= $rememberOldIntervals[0] OR
$new_random_high >= $rememberOldIntervals[1] ) {
$random = int(rand(1_000_000_000)) + 1;
my $new_random_low = $random - 100;
my $new_random_high = $random + 100;
}
}
}
Этот последний цикл должен быть встроен в другой, чтобы водить его много раз, скажем, 10 000 раз.
Вы хотите, чтобы все ваши сгенерированные интервалы имели одинаковую ширину, например. 100? –
В конце концов нет. В дальнейшем я хочу использовать массив интервалов. На данный момент я думал, что оставлю эту часть проще. На данный момент более важна базовая структура вещи. – ES55
сохраняйте свои интервалы отсортированными и каждый раз, когда у вас есть потенциальный новый интервал, выполните двоичный поиск, чтобы узнать, соответствует ли он. это должно быть разумным, если полные результирующие интервалы составляют очень небольшую часть от общего объема; в противном случае вам может понадобиться усложниться, чтобы избежать невозможных договоренностей. – ysth