rand() % n
, ma riflettendo, oltre al fatto che bisognerebbe controllare che \( n \leq RAND_{MAX} + 1 \), mi sono reso conto che solo in alcuni casi la suddetta formula fornisce una distribuzione uniforme, ossia quando \( RAND_{MAX} + 1 = k \cdot n \) con \( k \in N^+ \).Per esempio ipotizzando \( RAND_{MAX} = 15 \) e \( n = 7 \)
- Codice:
0 % 7 = 0
1 % 7 = 1
2 % 7 = 2
3 % 7 = 3
4 % 7 = 4
5 % 7 = 5
6 % 7 = 6
7 % 7 = 0
8 % 7 = 1
9 % 7 = 2
10 % 7 = 3
11 % 7 = 4
12 % 7 = 5
13 % 7 = 6
14 % 7 = 0
15 % 7 = 1
avremmo
$p(0) = p(1) = 3/(RAND_(MAX)+1) = 3 / 16$
$p(2) = p(3) = p(4) = p(5) = p(6) = 2 / 16$
Magari poi penso a qualcosa di più raffinato, ma nel frattempo dal momento che non so come funzioni
rand()
dietro le quinte, mi chiedevo se un approccio rudimentale come il seguente restituisca o meno una distribuzione uniforme:- Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned int my_rand(unsigned int n)
{
if(n > RAND_MAX + 1)
{
return n;
}
if(!((RAND_MAX + 1) % n))
{
return rand() % n;
}
unsigned int r;
for(unsigned int a = RAND_MAX / n * n; (r = rand()) >= a;);
return r % n;
}
int main()
{
srand(time(0));
printf("%u\n", my_rand(37));
}