Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion hhss/c/prelex.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ extern array_t *prelex(array_t *db, int datcnt) {
lastpos = array_size(db);

for (int k = 0; k < datcnt; k++) {
rv = rand_range(0, lastpos); /* [0, lp) */
rv = rand_range(0, lastpos - 1); /* [0, lp - 1] */

curr = array_get(db, rv);
last = array_get(db, lastpos - 1);
Expand Down
9 changes: 4 additions & 5 deletions hhss/c/replace.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ extern void replace_templates(array_t *pts, array_t *rtdb) {
if (rtslen == 0)
synerr_empty();

v = rand_range(0, rtslen);
v = rand_range(0, rtslen - 1);
rt = *((char **) array_get(rts, v));

sectarr = rtdbquery(rtdb, rt);
Expand Down Expand Up @@ -80,9 +80,8 @@ static void rthandle_user(symbol_t *sym, array_t *sectarr) {
goto common;
}

do {
r = rand_range(0, siz);
} while (r == pre_user);
do r = rand_range(0, siz - 1);
while (r == pre_user);
pre_user = r;

common:
Expand All @@ -93,7 +92,7 @@ static void rthandle_else(symbol_t *sym, array_t *sectarr) {
int r, siz;

siz = array_size(sectarr);
r = rand_range(0, siz);
r = rand_range(0, siz - 1);
rthandle_common(sym, sectarr, r);
}

Expand Down
39 changes: 36 additions & 3 deletions lib/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,43 @@ extern void seed(void) {
srand(time(NULL));
}

/* Refer to https://c-faq.com/lib/randrange.html */
extern int rand_range(int min, int max) {
if (max <= 0)
VERR("max must be greater than 0, but given %d", max);
return min + rand() / (RAND_MAX / max + 1);
if (min > max)
ERR("min should be less than max.");
Comment thread
logic-finder marked this conversation as resolved.
Outdated

if (min == max)
return min;

unsigned long nbucket; /* number of buckets */
unsigned int bucket_siz, threshold, rv;

/* since range is long, it's safe if max and min
were INT_MAX and INT_MIN, respectively */
nbucket = 1UL + max - min;
/* since rand() returns [0,RAND_MAX], the number of total
possible return values is RAND_MAX + 1 */
/* specify 'u' in order to treat it as a unsigned int value */
bucket_siz = (RAND_MAX + 1UL) / nbucket;
threshold = bucket_siz * nbucket;

do rv = rand();
while (rv >= threshold);

return min + (int) (rv / bucket_siz);
Comment thread
logic-finder marked this conversation as resolved.
Outdated

/* An example simulation.
Suppose RAND_MAX = 10, nbucket = 3.
Since bucket_siz = (10 + 1) / 3 = 3,
threshold = 3 * 3 = 9.
Since RAND_MAX is 10, rand() returns [0,10].
If rand returns 9 or 10, re-roll.
If rand returns 0 ~ 8, then
rv = 0,1,2 => rv / 3 = 0
rv = 3,4,5 => rv / 3 = 1
rv = 6,7,8 => rv / 3 = 2
Thus, all numbers (min ~ max) have an equal
possibility to appear. */
}

extern int mblen_(char ch) {
Expand Down
4 changes: 2 additions & 2 deletions yandere/c/noise.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ extern void noise(const char *msg) {
bool overflow;

for (i = k = 0; msg[i] != '\0'; /* empty */) {
rv = rand_range(0, 6);
rv = rand_range(0, 5);
chlen = mblen_(msg[i]);
overflow = (k + chlen) >= (BUFMAX - 1);

if (overflow) break;
if (rv == 0) { /* 1/6 chance */
buf[k++] = *("#?@" + rand_range(0, 3));
buf[k++] = *("#?@" + rand_range(0, 2));
i += chlen;
}
else for (int m = 0; m < chlen; m++)
Expand Down
Loading