28/02/2024, 22:09
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^+ \). 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
rand()
dietro le quinte, mi chiedevo se un approccio rudimentale come il seguente restituisca o meno una distribuzione uniforme:#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));
}
29/02/2024, 07:56
29/02/2024, 22:42
29/02/2024, 23:27
Quinzio ha scritto:In rete trovi tutto su come funzionano quelle funzioni pseudo-causali tipo la rand.
Pero' non so se ne vale la pena, bisogna spenderci del tempo e dipende da cosa devi fare.
rand()
.Quinzio ha scritto:Direi che va bene, fa quello che deve fare.
apatriarca ha scritto:l'espressione rand() % n non genera numeri uniformi come hai già osservato
05/03/2024, 11:21
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.
Powered by phpBB © phpBB Group - Privacy policy - Cookie privacy
phpBB Mobile / SEO by Artodia.