У меня есть набор чисел ~ 100, я хочу выполнить симуляцию MC для этого набора, основная идея в том, что я полностью рандомизирую набор, сделаю несколько сравнений / проверок для первых ~ 20 значений, сохраню результат и повторю.
Теперь алгоритм сравнения / проверки очень быстр, он фактически завершается примерно за 50 циклов ЦП. Имея это в виду и чтобы оптимизировать эти симуляции, мне нужно генерировать случайные множества как можно быстрее.
В настоящее время я использую алгоритм Multiply With Carry от George Marsaglia, который дает мне случайное целое число в 17 циклах процессора, довольно быстро. Однако, используя алгоритм тасования Фишера-Йейтса, я должен сгенерировать 100 случайных целых чисел, ~ 1700 циклов ЦП. Это затмевает мое время сравнения долгими путями.
Итак, мой вопрос: существуют ли другие хорошо известные / надежные методы для выполнения этого типа симуляции MC, где я могу избежать длительного времени генерации случайных наборов?
Я думал о случайном выборе 20 значений из набора, но затем мне нужно было выполнить проверку столкновений, чтобы убедиться, что были выбраны 20 уникальных записей.
Обновление:
Спасибо за ответы. У меня есть еще один вопрос, касающийся метода, который я только что придумал после моего поста. Вопрос в том, обеспечит ли это действительно надежный (при условии, что ГСЧ хороший) случайный выход. По сути, мой метод состоит в том, чтобы установить массив целочисленных значений той же длины, что и мой входной массив, установить каждое значение на ноль. Теперь я начинаю случайным образом выбирать 20 значений из входного набора следующим образом:
int pcfast[100];
memset(pcfast,0,sizeof(int)*100);
int nchosen = 0;
while (nchosen<20)
{
int k = rand(100); //[0,100]
if ( pcfast[k] == 0 )
{
pcfast[k] = 1;
r[nchosen++] = s[k]; // r is the length 20 output, s the input set.
}
}
В основном то, что я упомянул выше, выбирая 20 значений случайным образом, за исключением того, что это выглядит как несколько оптимизированный способ предотвращения коллизий. Это обеспечит хороший случайный вывод? Это довольно быстро.