Блог пользователя DiIzhan

Автор DiIzhan, история, 7 лет назад, По-русски

Hi, Codeforces! I usually create a testset founded on rand (), but the range of this function is 10^5. And if I want to generate a big number, I used to write a function like this

llong randomize (llong x) {
	llong res = 1;
	for (llong i = 1; i <= 5; ++ i) {
		res *= rand () * 1LL;
		res %= x;
	} return res % x + 1;
}

but there's high probability of returning 1.

If you have an effective method of using rand () function, please, write your way.

P.S. sorry for bad english.

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I think you can use mt19937_64.

»
7 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

It's not 105. Afaik, it's compiler-defined. If you use MinGW on Windows, chances are its range is [0; 32767].

I use the following hack so it works both on Windows and Linux within [0; 2^30) in practice:

int randint(int l, int r) {
  int v = (rand() << 15) ^ rand();
  v %= r - l + 1;
  return v + l;
}

Good property: if rand() is uniform, this function is almost uniform as well (first values between l and r are slightly more likely).