Я делаю MC моделирование и мне нужно для генерации случайных чисел в пределах диапазона между 1
и переменным верхним пределом n_mol
Эффективного способ генерации случайных чисел в пределах диапазона в Джулии
Специфической функцией Julia для этого является rand(1:n_mol)
где n_mol
- целое число, которое изменяется с каждой итерацией MC. Проблема в том, что делать это медленно ... (возможно, проблема для разработчиков Julia). Поэтому вместо того, чтобы использовать этот вызов функции, я подумал о создании случайного поплавка в [0,1], умножьте его на n_mol
, а затем получите целочисленную часть результата: int(rand()*n_mol)
проблема в том, что int()
округляет, чтобы я мог закончить с 0
и , и я не могу получить 0
... поэтому решение, которое я использую на данный момент, использует ifloor
и добавляет 1
, ifloor(rand()*n_mol)+1
, что значительно быстрее, чем первое, но медленнее второго ,
function t1(N,n_mol)
for i = 1:N
rand(1:n_mol)
end
end
function t2(N,n_mol)
for i = 1:N
int(rand()*n_mol)
end
end
function t3(N,n_mol)
for i = 1:N
ifloor(rand()*n_mol)+1
end
end
@time t1(1e8,123456789)
@time t2(1e8,123456789)
@time t3(1e8,123456789)
elapsed time: 3.256220849 seconds (176 bytes allocated)
elapsed time: 0.482307467 seconds (176 bytes allocated)
elapsed time: 0.975422095 seconds (176 bytes allocated)
Итак, есть ли способ сделать это быстрее со скоростями вблизи второго теста? Это важно, потому что симуляция MC идет более чем на 1e10 итераций. Результат должен быть целым числом, потому что он будет использоваться как индекс массива.
Вы смотрели в библиотеке MCMC Джулии, Lora.jl? –
Будьте очень осторожны, реализуя свои собственные ярлыки. Я не эксперт по случайным числам, но я знаю, что вы можете легко ввести предубеждения, изменяя случайные числа. И 't2', и' t3' требуют, чтобы 'n_mol« maxintfloat (Float64) ». И 't2' будет слегка смещен к четным числам на Julia 0.4, поскольку он использует [« беспристрастное »округление] (https://en.wikipedia.org/wiki/Rounding#Round_half_to_even) по умолчанию (иронично, no? Again, this эффект будет больше по мере увеличения количества n_mol. –
Спасибо за предложения! – Esteban