Gerar números Reais Aleatórios [RESOLVIDO]

1. Gerar números Reais Aleatórios [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/04/2020 - 17:44h

Olá, preciso criar um código que gere números aleatórios entre o intervalo 0,97 à 0,99 com uma precisão de casa decimal de 10^-4. Eu preciso gerar 180 números com variações dentro deste intervalo. Na verdade preciso de um vetor com números reais fracionários e positivos para serem incluídos em um projeto primário maior. Estou aberto a sugestões, obrigado.


  


2. MELHOR RESPOSTA

Paulo
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)

3. Re: Gerar números Reais Aleatórios

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/04/2020 - 21:40h

Taskinthemorning escreveu:

Olá, preciso criar um código que gere números aleatórios entre o intervalo 0,97 à 0,99 com uma precisão de casa decimal de 10^-4.
Eu preciso gerar 180 números com variações dentro deste intervalo.
Na verdade preciso de um vetor com números reais fracionários e positivos para serem incluídos em um projeto primário maior.
Estou aberto a sugestões, obrigado.

Boa noite Taskinthemorning.
Segue sugestão, em bash:
Gere um txt com os números:
awk -F":" 'BEGIN{for(i=0.97;i<=0.99;i=(i+0.0001)) printf "%.4f\n" ,i}' >> num.txt
O comando shuf, "embaralha" o conteúdo do arquivo, e mostra 180.
shuf -n180 num.txt

Outra opção, de 0.9600 a 0.9899
echo $(bc <<< "scale=2;$((97+RANDOM%2))/100")$((RANDOM%100))
+ uma, de 0.9700 a 0.9900
echo 0.{97,98}{00..99} 0.9900|tr " " "\n"|shuf -n180


______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts