00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef ETIRM_BOOTSTRAPSAMPLE_H_
00018 #define ETIRM_BOOTSTRAPSAMPLE_H_
00019
00020 #ifdef ETIRM_NO_DIR_PREFIX
00021 #include "etirmtypes.h"
00022 #else
00023 #include "etirm/etirmtypes.h"
00024 #endif
00025
00026 #include <iterator>
00027
00028 namespace etirm
00029 {
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 template <class URNG, class EI> void BootstrapSample(EI examinees_begin, EI examinees_end,
00049 URNG &rand)
00050 {
00051
00052 std::iterator_traits<EI>::difference_type n = std::distance(examinees_begin, examinees_end);
00053
00054 if (rand.min() != 1 || rand.max() != n)
00055 {
00056 throw InvalidArgument("Invalid range for random number generator",
00057 "SCPPNT::BootstrapSample");
00058 }
00059
00060
00061 std::vector<int> counts(n, 0);
00062
00063
00064 for (int i=0; i<n; ++i)
00065 {
00066 ++counts[rand()-1];
00067 }
00068
00069
00070 for (std::vector<int>::iterator ic = counts.begin(); examinees_begin != examinees_end; ++ic,
00071 ++examinees_begin)
00072 {
00073 (*examinees_begin)->SetCount(*ic);
00074 }
00075 }
00076
00077 }
00078
00079 #endif // ETIRM_BOOTSTRAPSAMPLE_H_