paulo1205
(usa Ubuntu)
Enviado em 07/04/2020 - 03:15h
Lembro de quando eu estava na faculdade, e que tínhamos de fazer dezenas ou centenas de medições de fenômenos físicos (períodos de pêndulos, espessuras de coisas, acelerações de coisas caindo etc.) em aulas de Física Experimental, a fim de treinar métodos de obtenção de médias e intervalos de erro, bem como propagação de erros em contas, e várias pessoas (possivelmente incluindo eu mesmo, na época) preferiam forjar valores após um punhado de medições a realizar e anotar resultados de todas as medições que eram requeridas.
A forma tradicional de obter valores aleatórios num intervalo [
A ,
B ] a partir de um gerador de números (pseudo-)aleatórios inteiros não-negativos com valores [
0 ,
RAND_MAX ] é fazer o seguinte.
n = A + (B-A)*rand_number/RAND_MAX
Na fórmula acima, a divisão
rand_number/RAND_MAX tem de produzir resultados fracionários. Em muitas linguagens de programação, uma forma de garantir isso é transformando os operandos
rand_number e
RAND_MAX em valores fracionários antes da divisão, e usar os valores convertidos na operação.
No seu caso, a fórmula ficaria o seguinte.
n = 0.97 + (0.02)*(rand_number/RAND_MAX)
Você pode expressar isso de diversas maneiras em diferentes linguagens de programação que suportem números de ponto flutuante.
/* Versão em C. */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
srand(time(NULL)); // Inicializa o gerador de números pseudo-aleatórios.
for(int i=0; i<100; ++i)
printf("%#0.4g\n", 0.97+0.02*(double)rand()/(double)RAND_MAX);
}
O Bash não trabalha com números de ponto flutuante, mas o ksh (pelo menos o ksh93) trabalha.
ksh -c 'for ((i=0; i<100; ++i)) do printf "%#0.4g\n" $((n=0.97+0.02*$RANDOM/32767.0)); done'
Com awk, os valores produzidos por
rand () já são fracionários e estão na faixa [0, 1), então a expressão fica mais simples.
awk 'BEGIN { srand(); for(i=0; i<100; ++i){ printf("%#0.4g\n", 0.97+0.02*rand()) } }'
Em Perl, será parecido, mas ainda um pouco mais curto, porque você pode passar o fator como argumento para a função
rand , que fará a multiplicação internamente para obter um valor na faixa [0, N).
perl -e 'for (1..100){ printf("%#0.4g\n", 0.97+rand(0.02)); }'
--------------
Nota: Todos os códigos acima geram valores segundo uma distribuição uniforme. Se você realmente quiser simular resultados experimentais que têm um valor médio e uma faixa de variação que vai ajudar a determinar um valor de erro aceitável, é provável que uma outra função de densidade de probabilidade tenha de ser usada, tal cmo uma de distribuição normal.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)