2016-01-17 3 views
3

только для удовольствия. Я запускаю генератор случайных чисел, чтобы получить номера powerball + powerball. Код ниже. Это медленно. И если я хочу запустить его 1000 раз, чтобы получить статистику, это займет много времени.Powerball in R: как работать быстрее?

Предложения, как ускорить его? Избавиться от цикла? Примечание: два случайных числа являются обязательными, так как сам powerball является отдельным ведром.

Ничего серьезного здесь. Просто весело. (Первый запуск был успешным в 175,226,831)

pwr_win = "4 8 19 27 34 10" 
n = 500000000 
win = 0 

for (i in 1:n) { 
    if (i %% 100000 == 0) print(i) 
    tmp = paste(paste(sort(sample(1:69,5)),collapse = " "),sample(1:26,1),collapse = " ") 
    if (tmp == pwr_win) { 
    print(paste("win",i)) 
    win = i 
    } 
} 

print(win) 

EDIT: желаемая производительность - запустить код, чтобы получить выигрышный номер пробного (неограниченная попытку), скажем, 290,000,000. Повторите много раз, чтобы получить среднее значение, чтобы доказать гибкость 1/292M.

+1

Почему вы вставляя их вместе? Я думаю, что сравнение целых чисел будет быстрее, чем выполнение всего этого вставки. –

+0

вставка для 5 чисел + powerball. паста может занять некоторое время действительно –

+0

Идеально. было бы неплохо избавиться от пасты, а также избавиться от ограничений 500M - у меня просто не было времени подумать об этом осторожно –

ответ

2

Я думаю, было бы более эффективно использовать целые числа вместо сравнения строк. Следующая функция pbSim() берет выигрышные номера в качестве входных данных, запускает один ничья powerball, сравнивает два powerballs, и если они совпадают, он продолжает рисовать оставшиеся числа. В противном случае он выходит с потерей. Тогда вы можете повторить это много раз, и вы, вероятно, никогда не выиграете.

pbSim <- function(numbers) { 
    if(!is.integer(numbers)) 
     numbers <- as.integer(numbers) 
    if(identical(sample(21, 1), tail(numbers, 1L))) { 
     draw <- sample(69, 5) 
     identical(sort(draw), head(numbers, -1L)) 
    } else FALSE 
} 

pwr_win <- c(4, 8, 19, 27, 34, 10) 
pbSim(pwr_win) 
# [1] FALSE 
replicate(10, pbSim(pwr_win)) 
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
+0

Итак, вы запустите его 500M раз, чтобы получить 1-й номер.Как бы вы оптимизировали его, чтобы он выполнял N раз, где каждый раз был победителем - чтобы получить средний балл по ансамблю –

+0

@AlexeyFerapontov - Возможно, я неправильно понял вопрос. Я не совсем уверен, что тебе нужно. Возможно, вам нужен другой ответ. –

+0

ОК, вот что мне нужно: запустите код один раз - получите пробный номер точного соответствия + powerball. Повторите 1000000 раз. Проблема в том, что мой код слишком медленный, чтобы запустить его даже 3 раза, чтобы получить среднее значение. –

3

Хорошо, немного поправляя правила игры. Я изменю свой ответ, но общий подход тот же - избегайте повторения одиночных билетов.

Я предполагаю, что есть

tickets = choose(69, 5) * 26 # 292201338 

возможные билеты. Одним из них является победителем

winner = sample(tickets, 1) 

Вы хотели бы играть несколько билетов, купленных с заменой purchases = sample(tickets, tries, TRUE), и повторять до тех пор, пока есть победитель

set.seed(123) 
tries <- 100000000; n <- 0 
repeat { 
    purchases = sample(tickets, tries, TRUE) 
    idx <- which(purchases == winner) 
    if (length(idx)) 
     break 
    n <- n + tries 
    message(n) 
} 

цикл завершается во второй итерации (а пара секунд), когда первым победителем был

> n + idx[1] 
[1] 136801728 

приобретенный билет.

Однако, как только вероятность выигрыша определяется, тогда легко получить время ожидания до покупки победителя. Выбор победителя - это процесс Пуассона, а время ожидания до первого успеха геометрически распределено. Можно быстро моделировать время ожидания до 1000 побед (то есть, 1000 выигрышных билетов) с rgeom(1000, 1/tickets), но, к сожалению, это приводит к переполнению целочисленного в R, поэтому мы вычислим их вручную

wait = log(runif(1000))/log(1 - 1/tickets)) + 1 
+0

В Powerball цифры не могут быть повторены, поэтому «TRUE» должно быть «FALSE» в «sample». Вы знаете, как быстро он работает до средней победы? –

Смежные вопросы