Strona 1 z 1

[java] Generator liczb z rozkładu normalnego

: 07 lip 2010, 17:24
autor: bulva
Witam,

Chciałbym napisać program generujący zadaną ilości liczb z rozkładu normalnego, używam algorytmu accept/reject (w zasadzie generuję liczby o rozkładzie wykładniczym a następnie decyduję o ich znaku, dzięki czemu dość wiernie przybliżam rozkład normalny).

Chciałbym zadeklarować tablicę (lub listę) i wykonywać kod w pętli while aż do zaakceptowania n liczb (pętla będzie musiała zrobić średnio jakieś 1.5*n przebiegów aby miec te n liczb). Jak to napisać?

Kod: Zaznacz cały

import javax.swing.*;
import java.util.*;

public class rnorm
{

		public static void main(String[] args) throws Exception
		{
	String input = JOptionPane.showInputDialog("How many numbers to draw?");
	int n = Integer.parseInt(input);	
	double x[]=new double[n];//?

int i = 0;	
while (   )//?
{
double u = (double)Math.random();
double y = -Math.log(u); 	
	
		if( Math.exp( - Math.pow(y-1,2) / 2 ) >= u){
	double coin = (double)Math.random();		
			if (coin>0.5)
				x[i]=y;
			else
				x[i]=-y;				
			i++;	
			}
			
}	
for(int j=0;j<x.length;j++){
System.out.println(x[j]);	
}
	}
}	

Odp: [java] Generator liczb z rozkładu normalnego

: 07 lip 2010, 22:07
autor: xc1256
interesuje cię takie coś ?
http://www.losowe.pl/liczba

Odp: [java] Generator liczb z rozkładu normalnego

: 08 lip 2010, 08:40
autor: bulva
Nie, w tym applecie losowane liczby maja rozkład jednostajny. W sumie doszedłem do czegoś takiego, wypełniam tablicę NaN i potem warunek sprawdza czy już wszystkei NaN zostały zastąpione. Pięknie tylko że nie działa :D

Kod: Zaznacz cały

import javax.swing.*;
import java.util.*;

public class rnorm
{

		public static void main(String[] args) throws Exception
		{
	String input = JOptionPane.showInputDialog("How many numbers to draw?");
	int n = Integer.parseInt(input);	
	double x[] = new double[n];

Arrays.fill(x, 0.0 / 0.0);

int i = 0;	
while (Double.isNaN(x[i])) //  Double.isNaN(x[i])  x.length < n
{
double u = (double)Math.random();
double y = -Math.log(u); 	
	
		if( Math.exp( - Math.pow(y-1,2) / 2 ) >= u){
	double coin = (double)Math.random();		
			if (coin>0.5)
				x[i]=y;
			else
				x[i]=-y;				
			i++;	
			}
			
}	
for(int j=0;j<x.length;j++){
System.out.println(x[j]);	
}
	}
}	

Odp: [java] Generator liczb z rozkładu normalnego

: 08 lip 2010, 13:12
autor: nwkj
http://epsrv.astro.uni.torun.pl/~arms/frGauss2.pdf

ew. http://www.piotrchojnacki.pl/przedmioty ... sowych.pdf ale tutaj będzisz musiał napisać dodatkowo rozkład wykładniczy (co nie powinno być problemem, bo jego dystrybuanta się ładnie odwraca).