Имитировать подбрасывание монеты в течение одной недели?

Это не домашнее задание. Мне интересно настроить симуляцию подбрасывания монеты в R. Я хотел бы запустить симуляцию на неделю. Есть ли в R функция, которая позволит мне запускать и останавливать моделирование в течение определенного периода времени, например, недели? Если все пойдет хорошо, я могу увеличить продолжительность периода моделирования.

Например:

x <- rbinom(10, 1, 1/2)

Итак, чтобы уточнить, вместо 10 в приведенном выше коде, как мне сохранить симуляцию в течение недели (количество испытаний в неделю по сравнению с установленным количеством испытаний)? Спасибо.


person Frank Zafka    schedule 22.06.2012    source источник
comment
Зачем тебе это нужно? Неужто результат зависит от машинной скорости вашего компьютера?   -  person Andrie    schedule 22.06.2012
comment
Не все ли равно, почему? Хотелось бы узнать, возможно ли это. Я понимаю, что это банальная просьба. Это частично поможет мне сделать то, что я надеюсь.   -  person Frank Zafka    schedule 22.06.2012
comment
Да, если хочешь, чтобы я тебе помог.   -  person Andrie    schedule 22.06.2012
comment
Придется ли вам учитывать монету? некоторые британские монеты имеют небольшой вес на стороне «головы»   -  person atmd    schedule 22.06.2012
comment
Я хочу это сделать, потому что мне интересно, возможно ли это. И у меня есть запасной Raspberry Pi, который сидит рядом со мной и ждет, чтобы его опробовать.   -  person Frank Zafka    schedule 22.06.2012
comment
Поместите его в цикл while, который проверяет системное время.   -  person joran    schedule 22.06.2012
comment
atmd ›нет, тип монеты не интересует.   -  person Frank Zafka    schedule 22.06.2012
comment
Запуск этого типа моделирования - стандартная процедура в паранормальных исследованиях, когда вы пытаетесь заставить случайный генератор сойти с ума, тяжело подумав. В прошлый раз, когда я пробовал реализовать в Windows, можно было манипулировать, но Linux стабилен (Дирку это понравится :-)   -  person Dieter Menne    schedule 22.06.2012
comment
@DieterMenne Ну, ты все равно прочитал мои мысли! подмигивание.   -  person Frank Zafka    schedule 22.06.2012
comment
@RSoul: я думаю, что проблема, о которой вам никто не упоминает, заключается в том, что проведение недельных подбрасываний монеты - это МНОГО подбрасываний монеты. Поскольку эти подбрасывания монет производятся с помощью генератора псевдослучайных чисел, в зависимости от того, какой генератор чисел используется и как он используется, возможно, что в течение недели вы перебираете весь период генератора. Другими словами, возможно, что ваше моделирование использует всю псевдослучайность вашего компьютера и начинает повторно использовать ее снова и снова.   -  person Jérémie    schedule 15.07.2012


Ответы (3)


Вот код, который будет продолжать работать в течение трех секунд, затем остановится и распечатает итоги.

x <- Sys.time()
duration <- 3 # number of seconds
heads <- 0
tails <- 0

while(Sys.time() <= x + duration){
  s <- sample(0:1, 1)
  if(s == 1) heads <- heads+1 else tails <- tails+1
  cat(sample(0:1, 1))
}
cat("heads: ", heads)
cat("tails: ", tails)

Результаты, достижения:

001100111000011010000010110111111001011110100110001101101010 ...
heads:  12713
tails:  12836

Предупреждение:

Держу пари, что на скорости моей машины вы получите ошибку с плавающей запятой long до конца недели. Другими словами, вы можете получить максимальное значение, которое ваша машина позволяет хранить в виде целого числа, двойного числа, числа с плавающей запятой или того, что вы используете, и тогда ваш код выйдет из строя.

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


Для ускоренной иллюстрации того, что произойдет, попробуйте следующее:

x <- 1e300
while(is.finite(x)){
  x <- x+x
  cat(x, "\n")
}

R корректно справляется с перегрузкой с плавающей запятой и возвращает Inf.

Итак, все данные, которые у вас были при моделировании, теперь потеряны. Невозможно сколько-нибудь разумно проанализировать бесконечность.

Помните об этом, когда будете проектировать симуляцию.

person Andrie    schedule 22.06.2012
comment
Спасибо @Andrie. Кажется, это именно то, что мне нужно. Я понимаю, что это была странная просьба, но мне нравится изучать эти аспекты R. Просто любопытно. Могу я задать еще один вопрос о нехватке памяти и т. Д., Или у вас есть какие-нибудь идеи? Если я проведу это в течение недели, будет ли это поддающимся анализу? - person Frank Zafka; 22.06.2012
comment
Это не об управлении памятью. Это о том, как компьютеры хранят ценности. Прочтите о целых числах и значениях с плавающей запятой в любом руководстве программиста, например на en.wikipedia.org/wiki/Floating_point. В моем коде я храню только два значения. Это никогда не исчерпает память. Но вы все равно можете получить ошибку с плавающей запятой (или любой другой эквивалент R). - person Andrie; 22.06.2012
comment
Машина, выполняющая моделирование, находится в сети с доступом к террабайтной памяти. Я предполагаю, что это просто случай передачи данных по сети, чтобы не перегружать систему. Мой настоящий проект связан лишь косвенно, но все идеи утилизируются. - person Frank Zafka; 22.06.2012
comment
Проблема в том, что вектор значений становится слишком длинным, я думаю, максимальная длина составляет 2 ^ 31-1. Что вы можете сделать, так это время от времени сохранять и сбрасывать вектор. - person Paul Hiemstra; 22.06.2012
comment
Хорошо. Я понимал, что это потребует некоторого планирования. Думаю, я уйду и спланирую, как продлить процесс на неделю. - person Frank Zafka; 22.06.2012
comment
Как вариант, можно не сохранять результаты, а только сводную статистику, то есть количество орлов или решек. - person Paul Hiemstra; 22.06.2012
comment
@RSoul Если вы время от времени сбрасываете свой результат в файл, все в порядке. - person Roman Luštrik; 22.06.2012
comment
Нет, мне определенно нужны все данные. TBH, я действительно делал данные броска костей (1/6), поэтому мне нужны данные лиц для каждого испытания. Я, наверное, просто попробую записать каждое испытание в текстовый файл, не так ли? - person Frank Zafka; 22.06.2012
comment
@RSoul - Я думаю, вы могли бы добавить некоторую логику в свой цикл while, чтобы проверить общую длину вектора. Когда он дойдет до определенной точки, запишите его в файл, сбросьте вектор и начните заново. Со скоростью современных компьютеров это может быть очень большой набор данных для анализа в конце ... но я полагаю, вы разберетесь с этим. - person Chase; 22.06.2012
comment
Я пытаюсь подчеркнуть, что даже ваши сводные данные могут достичь Inf за короткий промежуток времени, в зависимости от скорости вашего компьютера. См. Мой измененный пример, который достигает Inf примерно за 16 шагов. - person Andrie; 22.06.2012
comment
@Andrie, но если я запишу каждую попытку подбрасывания монеты в текстовый файл, это будет нормально? По крайней мере, со стороны записи данных. - person Frank Zafka; 22.06.2012
comment
Возможно. Но вы, скорее всего, столкнетесь с этой проблемой: stackoverflow.com/q/11139315/602276 - person Andrie; 22.06.2012
comment
Что ж, я уже сталкиваюсь с проблемами, но разве это не половина удовольствия? - person Frank Zafka; 22.06.2012
comment
@RSoul Это более чем половина удовольствия. Удачи! - person Andrie; 22.06.2012
comment
@RSoul Вы можете посмотреть на пакет gmp, чтобы избежать integer арифметических действий. - person James; 09.07.2012

Хотя сейчас меньше, чем через неделю, добавить отметку времени к x rbinmo(1,1,1/2)

R> week_later <- strptime("2012-06-22 16:45:00", "%Y-%m-%d %H:%M:%S")
R> x <- rbinom(1, 1, 1/2) // init x
R> while(as.numeric(Sys.time()) < as.numeric(week_later)){
R>   x <- append(x, rbinom(1, 1, 1/2))
R> }
person jonbros    schedule 22.06.2012
comment
Да, но это наверняка превысит объем памяти вашего компьютера до истечения недели. OP действительно должен предоставить конкретные детали того, что они моделируют, чтобы получить полный ответ. - person joran; 22.06.2012
comment
Мне кажется, что это 2 вопроса. Как бегать неделю? Как бороться с проблемами памяти, запустив этот расчет в течение недели? К черту, если вы объедините два вопроса, и к черту, если нет. - person Frank Zafka; 22.06.2012
comment
Просто добавьте каждое значение в файл. Поскольку единственное требование - оставить машину работать в течение недели ... - person Roland; 22.06.2012
comment
Да, у меня была такая мысль. Пойду и исследую это. - person Frank Zafka; 22.06.2012

Возможно, вас заинтересует довольно новый пакет harvestr Эндрю Редда. Он разбивает задачу на части (идея состоит в том, что части могут выполняться параллельно). Часть пакета, которая применяется к вашему вопросу, заключается в том, что он кэширует результаты частей, которые уже были обработаны, так что если задача будет прервана и перезапущена, то завершенные части не будут перезапущены, но будут получены те, которые не были завершены (фрагменты, которые были прерваны на полпути, начнутся с начала этого фрагмента).

Это может позволить вам запускать и останавливать симуляцию по вашему запросу.

person Greg Snow    schedule 22.06.2012