… | |
… | |
42 | rand_gen rndm; |
42 | rand_gen rndm; |
43 | |
43 | |
44 | void |
44 | void |
45 | tausworthe_random_generator::seed (uint32_t seed) |
45 | tausworthe_random_generator::seed (uint32_t seed) |
46 | { |
46 | { |
47 | state [0] = max ( 2U, seed * 69069U); |
47 | state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U; |
48 | state [1] = max ( 8U, state [0] * 69069U); |
48 | state [1] = state [0] * 69069U; if (state [0] < 8U) state [0] += 8U; |
49 | state [2] = max ( 16U, state [1] * 69069U); |
49 | state [2] = state [1] * 69069U; if (state [0] < 16U) state [0] += 16U; |
50 | state [3] = max (128U, state [2] * 69069U); |
50 | state [3] = state [2] * 69069U; if (state [0] < 128) state [0] += 128U; |
51 | |
51 | |
52 | for (int i = 11; --i; ) |
52 | for (int i = 11; --i; ) |
53 | operator ()(); |
53 | operator ()(); |
54 | } |
54 | } |
55 | |
55 | |
… | |
… | |
63 | |
63 | |
64 | return state [0] ^ state [1] ^ state [2] ^ state [3]; |
64 | return state [0] ^ state [1] ^ state [2] ^ state [3]; |
65 | } |
65 | } |
66 | |
66 | |
67 | uint32_t |
67 | uint32_t |
68 | tausworthe_random_generator::get_range (uint32_t r_max) |
68 | tausworthe_random_generator::get_range (uint32_t num) |
69 | { |
69 | { |
70 | return next () % r_max; |
70 | return (next () * (uint64_t)num) >> 32U; |
71 | } |
71 | } |
72 | |
72 | |
73 | // return a number within (min .. max) |
73 | // return a number within (min .. max) |
74 | int |
74 | int |
75 | tausworthe_random_generator::get_range (int r_min, int r_max) |
75 | tausworthe_random_generator::get_range (int r_min, int r_max) |
76 | { |
76 | { |
77 | return r_min + (*this) (max (r_max - r_min + 1, 1)); |
77 | return r_min + get_range (max (r_max - r_min + 1, 0)); |
78 | } |
78 | } |
79 | |
79 | |
80 | /* |
80 | /* |
81 | * The random functions here take luck into account when rolling random |
81 | * The random functions here take luck into account when rolling random |
82 | * dice or numbers. This function has less of an impact the larger the |
82 | * dice or numbers. This function has less of an impact the larger the |
… | |
… | |
97 | { |
97 | { |
98 | int base = r_max - r_min > 1 ? 20 : 50; /* d2 and d3 are corner cases */ |
98 | int base = r_max - r_min > 1 ? 20 : 50; /* d2 and d3 are corner cases */ |
99 | |
99 | |
100 | if (r_max < 1 || r_max < r_min) |
100 | if (r_max < 1 || r_max < r_min) |
101 | { |
101 | { |
102 | LOG (llevError, "Calling random_roll with min=%d max=%d\n", r_min, r_max); |
102 | LOG (llevError | log_Backtrace, "Calling random_roll with min=%d max=%d\n", r_min, r_max); |
103 | return r_min; |
103 | return r_min; |
104 | } |
104 | } |
105 | |
105 | |
106 | if (op->type == PLAYER) |
106 | if (op->type == PLAYER) |
107 | { |
107 | { |
… | |
… | |
130 | diff = max - min + 1; |
130 | diff = max - min + 1; |
131 | ((diff > 2) ? (base = 20) : (base = 50)); /* d2 and d3 are corner cases */ |
131 | ((diff > 2) ? (base = 20) : (base = 50)); /* d2 and d3 are corner cases */ |
132 | |
132 | |
133 | if (max < 1 || diff < 1) |
133 | if (max < 1 || diff < 1) |
134 | { |
134 | { |
135 | LOG (llevError, "Calling random_roll with min=%" PRId64 " max=%" PRId64 "\n", min, max); |
135 | LOG (llevError | log_Backtrace, "Calling random_roll64 with min=%" PRId64 " max=%" PRId64 "\n", min, max); |
136 | return (min); /* avoids a float exception */ |
136 | return (min); /* avoids a float exception */ |
137 | } |
137 | } |
138 | |
138 | |
139 | /* |
139 | /* |
140 | * Make a call to get two 32 bit unsigned random numbers, and just to |
140 | * Make a call to get two 32 bit unsigned random numbers, and just to |
… | |
… | |
553 | fork_abort (const char *msg) |
553 | fork_abort (const char *msg) |
554 | { |
554 | { |
555 | if (!fork ()) |
555 | if (!fork ()) |
556 | { |
556 | { |
557 | signal (SIGABRT, SIG_DFL); |
557 | signal (SIGABRT, SIG_DFL); |
|
|
558 | // try to put corefiles into a subdirectory, if existing, to allow |
|
|
559 | // an administrator to reduce the I/O load. |
|
|
560 | chdir ("cores"); |
558 | abort (); |
561 | abort (); |
559 | } |
562 | } |
560 | |
563 | |
561 | LOG (llevError, "fork abort: %s\n", msg); |
564 | LOG (llevError, "fork abort: %s\n", msg); |
562 | } |
565 | } |
… | |
… | |
607 | memcpy (dst + maxlen - 4, "...", 4); |
610 | memcpy (dst + maxlen - 4, "...", 4); |
608 | } |
611 | } |
609 | } |
612 | } |
610 | else |
613 | else |
611 | memcpy (dst, src, len + 1); |
614 | memcpy (dst, src, len + 1); |
|
|
615 | } |
|
|
616 | |
|
|
617 | const std::string |
|
|
618 | format (const char *format, ...) |
|
|
619 | { |
|
|
620 | int len; |
|
|
621 | |
|
|
622 | { |
|
|
623 | char buf[128]; |
|
|
624 | |
|
|
625 | va_list ap; |
|
|
626 | va_start (ap, format); |
|
|
627 | len = vsnprintf (buf, sizeof (buf), format, ap); |
|
|
628 | va_end (ap); |
|
|
629 | |
|
|
630 | assert (len >= 0); // shield againstz broken vsnprintf's |
|
|
631 | |
|
|
632 | // was our static buffer short enough? |
|
|
633 | if (len < sizeof (buf)) |
|
|
634 | return std::string (buf, len); |
|
|
635 | } |
|
|
636 | |
|
|
637 | { |
|
|
638 | // longer, try harder |
|
|
639 | char *buf = salloc<char> (len + 1); |
|
|
640 | |
|
|
641 | va_list ap; |
|
|
642 | va_start (ap, format); |
|
|
643 | vsnprintf (buf, len + 1, format, ap); |
|
|
644 | va_end (ap); |
|
|
645 | |
|
|
646 | const std::string s (buf, len); |
|
|
647 | sfree<char> (buf, len + 1); |
|
|
648 | |
|
|
649 | return buf; |
|
|
650 | } |
612 | } |
651 | } |
613 | |
652 | |
614 | tstamp now () |
653 | tstamp now () |
615 | { |
654 | { |
616 | struct timeval tv; |
655 | struct timeval tv; |