quest'ultimo algoritmo è quanto meno inefficiente, se devo cercare un numero in un dato RANGE > 0 , dato che rand genera un numero compreso tra 0 e RAND_MAX, la probabilità di beccare un numero nel RANGE ad ogni iterazione è di RANGE / RAND_MAXX, dove RAND_MAXX = RAND_MAX + 1.

In pratica prima di beccare un certo numero devi fare rand_max / 2 tentativi in media, e te lo dimostro.....

Utilizziamo la distribuzione binomiale per calcolare quanti tentativi sono necessari affinchè la probabilità di colpire un numero nel range sia del 50%.

se dovessimo trovare qual'è la probabilità che su n iterazioni almeno k risultati siano positivi la formula sarebbe

P(n,k) = n! / (k! * (n-k)!) * p^k * (1-p)^(n-k)

nel nostro caso il loop si interrompe alla prima iterazione con risultato positivo, quindi k=1

sia p = RANGE / RAND_MAXX
sia q = 1 - p

P(n,1) = n * p * q ^ (n - 1)

se poniamo P(n,1) = 0.5

0.5 = n * p * q ^ (n - 1)

ovvero

0 = n * p * q ^ (n - 1) - 0.5

su cui discutiamo un attimo prima di risolvere, rinominiamo intanto n in x:

0 = x * p * q ^ (x - 1) - 0.5

questa curva per x = 0 => y = -0.5

piu p si avvicina a zero e piu q si avvicina ad uno essendo q = 1 - p.

separiamo x * p, chiamiamolo J, e notiamo che questo valore cresce molto lentamente per p tendente a zero, quindi per p tendente a zero x deve tendere molto rapidamente a + infinito per fare si che J superi 0.5

prendiamo ora q ^ (x - 1) e chiamiamolo K

man mano che q tende ad 1 K tende ad avvicinarsi ad 1 rimanendo sempre minore di uno.

riepilogando J richiede x molto grandi per avvicinarsi a 0.5, K per x molto grandi tende ad avvicinarsi ad 1 quindi ignoriamolo un attimo visto che 1 è l'identità per il prodotto.

Cio significa che piu RAND_MAXX è grande piu il numero di iterazioni necessarie a trovare un numero in un range stretto cresce

esempio:
quante iterazion si fanno in media per trovare 1 numero tra 0 e 1 se rand max = 32678?

x * 3.06E-5 * 0.99997 ^ (n-1) - 0.5 = 0

0.99997 ^ (n-1) lo ignoriamo visto che sarà qualcosa di vicino ad 1 che non sposta di molto il risultato finale quindi

x * 3.06E-5 - 0.5 = 0

x = 0.5 / 3.06E-5

circa 16399 tentativi in media.....

ancora esempio:
RAND_MAX = 2^31

circa 1073741824 in media

senza contare che è (poco) possibile anche il caso in cui non si ottiene mai il risultato.

Fine della dim.

Ora la soluzione al problema era molto piu semplice e cioe

num = rand() % (max - min) + min;