Logo Hardware.com.br
GBastos
GBastos Super Participante Registrado
777 Mensagens 4 Curtidas

C - Vetor de dados aleatorios com distribuição exponencial

#1 Por GBastos 08/08/2006 - 23:15
Olá,

Fase final do meu projeto final! big_green.png
Estou precisando agora preencher um vetor com dados aleatórios mas não com distribuição normal e sim distribuição exponencial.
A questão é que não sei como isso seria em C. Em Delphi seria assim:

function DistribuicaoUniforme: Double;
begin
Result := Random(1000000000) / 1000000000;
end;

function DistribuicaoExponencial(Lambda : Double): Double;
begin
Result := (-Ln(1.0 - DistribuicaoUniforme) / Lambda);
end;


Só que até onde sei, não tem Ln em C. E aí, como fazer?
peczenyj
peczenyj Geek Registrado
3K Mensagens 75 Curtidas
#2 Por peczenyj
09/08/2006 - 09:27
Existe sim:
http://www.cppreference.com/stdmath/log.html

The function log() returns the natural (base e) logarithm of num. There's a domain error if num is negative, a range error if num is zero.

Agora o Random eu não entendi. vc gera um numero entre 0 e 1? Para gerar numeros aleatorios veja estas funções

http://www.cppreference.com/stdother/rand.html
http://www.cppreference.com/stdother/srand.html

De uma olhada aqui para encontrar exemplos:
http://www.java2s.com/Code/C/Math/Random.htm

[]´s
tetim
tetim Membro Senior Registrado
366 Mensagens 1 Curtida
#3 Por tetim
09/08/2006 - 09:39
Eu não sei nada, nada mesmo de pascal...

Mas como seria a variação exponencial aleatória?
Variando o expoente? De quanto a quanto?
Variando a base? De quanto a quanto?
Variando o expoente e a base? De quanto a quanto expoente e base?
No produto final da base elevado ao expoente? De quanto a quanto?

Ou não seria nada disso? rs
"Conseguirão parar uma, duas ou até tres flores, mas nunca conseguirão segurar a força de uma primavera..."[Chê Guevara]
GBastos
GBastos Super Participante Registrado
777 Mensagens 4 Curtidas
#4 Por GBastos
09/08/2006 - 11:36
tetim
Eu não sei nada, nada mesmo de pascal...

Mas como seria a variação exponencial aleatória?
Variando o expoente? De...


Rapaz, minha matemática está enferrujada (resultado das dezenas de Cálculos da faculdade, tomei horror pela coisa), mas o negocio é que quando vc usa uma função randomica pra preencher um vetor, a distribuição é normal, ou seja, todos os numeros tem a mesma probabilidade de serem sorteados, são uniformemente distribuidos, ficando assim:
67b69b1dd236a2fc54420d6676c607af

So que pro trabalho que estou fazendo, eu queria testar se a performance de um algoritmo de ordenação é a mesma independente da distribuição dos dados.
Na distribuição exponencial, os elementos se concentram em uma faixa, dependendo do lambda que vc informar, ficando assim:
f6d4a88ed4208e9d37706f17559930de


peczenyj, eu tinha usado algo do tipo que vc passou para gerar a distribuição uniforme: x = rand() % 100000000 / 100000000
E aí na distribuição exponencial: array[cont] = -log(x) / Lambda
Como vc vê, eu até tentei com o log pra ver que bicho ia dar mas estava dando sempre 0. Tem algo errado no que fiz?

Quanto a gerar um numero entre 0 e 1 foi pq li em algum lugar que ln so pode ser usado para valores nessa faixa. E, como vc pode ver nessa imagens, realmente é essa faixa que o cara usou no delphi.
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal