Um gerador de números pseudo-aleatórios da linguagem C
pode ser utilizado com a função pronta rand_r()
que, por sua vez, recebe como argumento um ponteiro para um número inteiro que é chamado de semente
.
A semente
é extremamente fundamental para a segurança do sistema, pois é a partir dela que a ordem dos números pseudo-aleatórios é definida, ou seja, para uma mesma semente a ordem de números gerados pela função rand_r()
será sempre a mesma.
Por exemplo:
Se você passar o número 380
como semente para a função rand_r()
três vezes, a sequência de números geradas é:
Se o número da semente for 381
, os números gerados são:
Os números são grandes e, por isso, estamos interessados em números módulo 8, ou seja as três primeiras sequências de números módulo 8 de 380
e 381
são:
0 1 1
6 6 3
leia mais sobre a função rand_r(3)
no manual.
Uma curiosidade intrínseca é saber quais números possuem um determinado valor após rodar a geração aleatória por 100000
vezes.
A entrada possui um único caso de teste, contendo uma linha possuindo três inteiros e ( e ) (cabe em um número inteiro sem sinal int
), representando o intervalo das possibilidades da semente, sendo o possível valor mais baixo e o maior valor possível para a semente e o valor que estamos procurando apóes 100000
iterações da geração de um número aleatório. Sabemos que a diferença entre e nunca é maior que .
A saída possui diversas linhas, contendo todas as sementes de entrada que possuem o mesmo número aleatório na iteração 100000
.
1 100 0
6
14
22
30
38
39
47
55
63
71
79
87
95
96
1 100 1
7
15
23
31
40
48
56
64
72
80
88
97
1 100 2
8
16
24
32
41
49
57
65
73
81
89
98
1 100 3
1
9
17
25
33
42
50
58
66
74
82
90
99
1 100 4
2
10
18
26
34
43
51
59
67
75
83
91
100
1 100 5
3
11
19
27
35
44
52
60
68
76
84
92
1 100 6
4
12
20
28
36
45
53
61
69
77
85
93
1 100 7
5
13
21
29
37
46
54
62
70
78
86
94