Фиксация семени имеет важное значение, когда мы пытаемся оптимизировать функцию, которая включает произвольно сгенерированные числа (например, при оценке на основе моделирования). Говоря кратко, если мы не зафиксируем семя, изменение из-за рисования разных случайных чисел, скорее всего, приведет к сбою алгоритма оптимизации.
Предположим, что по какой-либо причине вы хотите оценить стандартное отклонение ( sd) среднего нулевого нормального распределения путем моделирования, с учетом выборки. Это может быть достигнуто путем выполнения численной оптимизации вокруг этапов
Следующие функции делают это один раз без шага 1. один раз включив его:
# without fixing the seed
simllh <- function(sd,y,Ns){
simdist <- density(rnorm(Ns,mean=0,sd=sd))
llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
set.seed(48)
simdist <- density(rnorm(Ns,mean=0,sd=sd))
llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
return(-sum(log(llh)))
}
Мы можем проверить относительная производительность двух функций при обнаружении истинного значения параметра с коротким исследованием Монте-Карло:
N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for(i in 1:1000){
as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
y <- rnorm(N,sd=sd) # generate the data
est1[i] <- optim(1,simllh,y=y,Ns=1000,lower=0.01)$par
est2[i] <- optim(1,simllh.fix.seed,y=y,Ns=1000,lower=0.01)$par
}
hist(est1)
hist(est2)
Результирующие распределения оценок параметров:
Когда мы фиксируем семена, числовой поиск заканчивается ближе к истинному значению параметра 2 намного чаще.
Последовательность символов между < и> исключительно обращаются к заголовку, который является не обязательно файлом. Реализации являются в значительной степени бесплатными использовать последовательность символов, как они желают. (Главным образом, однако, просто рассматривайте его как имя файла и сделайте поиск в эти включает путь , как другие сообщения указывают.)
, Если эти #include "file"
форма используется, реализация сначала ищет файл имени, если поддерживается. Если не (поддерживаемый), или если поиск перестал работать, реализация ведет себя, как будто другой (#include <file>
) форма использовалась.
кроме того, третья форма существует и используется, когда #include
директива не соответствует ни одной из форм выше. В этой форме некоторая основная предварительная обработка (такая как макрорасширение) сделана на "операндах" #include
директива, и результат, как ожидают, будет соответствовать одной из двух других форм.
На практике различие находится в месте, где препроцессор ищет включенный файл.
Для #include <filename>
препроцессор ищет зависящим от реализации способом, обычно поисковыми каталогами, предопределенными компилятором/IDE. Этот метод обычно используется для включения стандартных заголовочных файлов библиотеки.
Для #include "filename"
препроцессор ищет сначала в том же каталоге как файл, содержащий директиву, и затем следует за путем поиска, используемым для эти #include <filename>
форма. Этот метод обычно используется для включения определенных программистами заголовочных файлов.
А больше полного описания доступно в документации GCC относительно путей поиска .
Эти <file>
включают, говорит препроцессору искать в -I
каталоги и в предопределенных каталогах первый , затем в каталоге.c файла. Эти "file"
включают, говорит препроцессору искать каталог исходного файла сначала , и затем возвращаться к -I
и предопределенный. Все места назначения ищутся так или иначе, только порядок поиска отличается.
стандарт 2011 года главным образом обсуждает включать файлы в "16.2 включениях Исходного файла".
2 А, предварительно обрабатывающие директиву формы
# include <h-char-sequence> new-line
поиски последовательность определенных реализацией мест для заголовка, определенного исключительно указанной последовательностью между < и> разделители и причины замена той директивы всем контентом заголовка. Как места определяются, или определенный заголовок определяется реализацией.
3 А, предварительно обрабатывающие директиву формы
# include "q-char-sequence" new-line
причины, замена той директивы всем содержанием исходного файла определяется указанной последовательностью между "разделителями. Именованный исходный файл разыскивается определенным реализацией способом. Если этот поиск не поддерживается, или если поиск перестал работать, директива повторно обрабатывается, как будто это читало
# include <h-char-sequence> new-line
с идентичной содержавшей последовательностью (включая> символы, если таковые имеются) из исходной директивы.
Примечание, что "xxx"
форма ухудшается к <xxx>
форма, если файл не найден. Остальное определяется реализацией.
Единственный способ знать состоит в том, чтобы прочитать документацию Вашей реализации.
В [1 114] стандарт C , разделите 6.10.2, абзацы 2 - 4 указывают:
директива предварительной обработки А формы
#include <h-char-sequence> new-line
поиски последовательность определенных реализацией мест для заголовок определенный исключительно указанной последовательностью между
<
и>
разделители и причины замена той директивы всем содержанием заголовок . Как места указаны, или определенный заголовок определяется реализацией.директива предварительной обработки А формы
#include "q-char-sequence" new-line
причины замена той директивы всем содержанием исходный файл определенный указанной последовательностью между эти
"
разделители. Именованное исходный файл разыскивается определенным реализацией способом. Если этот поиск не поддерживается, или если поиск перестал работать, директива повторно обрабатывается, как будто это читало#include <h-char-sequence> new-line
с идентичной содержавшей последовательностью (включая
>
символы, если таковые имеются) из исходной директивы.директива предварительной обработки А формы
#include pp-tokens new-line
(который не соответствует одной из двух предыдущих форм) разрешена. Маркеры предварительной обработки после
include
в директиве обрабатываются так же, как в обычном тексте. (Каждый идентификатор, в настоящее время определяемый как макро-имя, заменяется его заменяющим списком предварительной обработки маркеров.) Директива, заканчивающаяся после того, как, все замены должны соответствовать одной из двух предыдущих форм. Метод, которым последовательность предварительной обработки маркеров между<
и>
маркерная пара предварительной обработки или пара [1 111] символы объединены в единственный маркер предварительной обработки названия заголовка, определяется реализацией.Определения:
h-символ: любой член исходного набора символов кроме символа новой строки и
>
q-символ: любой член исходного набора символов кроме символа новой строки и
"