Generate random number with non-uniform density

后端 未结 5 944
我在风中等你
我在风中等你 2021-01-03 04:31

Did someone know how to generate random numbers with a non-uniform density?

5条回答
  •  北荒
    北荒 (楼主)
    2021-01-03 05:14

    This class takes a distribution as a matrix (each row is a couple of a number and its frequency) and generates random numbers. So you can have Look at main method and run.

    public class RandomGenerator {
        HashMap mappa = new HashMap();
        Random random = new Random();
        int max;
    
    
    
    
        public static void main(String as[]){ 
            int[][] matrice = new int[3][2];
            //number 5 occurs 5 times
            matrice[0][0] = 5 ;
            matrice[0][1] = 5 ;
            //number 18 occurs 18 times
            matrice[1][0] = 18 ;
            matrice[1][1] = 18 ;
            //number 77 occurs 77 times
            matrice[2][0] = 77 ;
            matrice[2][1] = 77 ;
    
            RandomGenerator randomGenerator = new RandomGenerator(matrice); 
    
    
            for (int i = 0; i < 100; i++) {
                System.out.println( randomGenerator.getNext() );
            }
        }
    
    
    
    
    
        public int getNext(){
            int percentile = random.nextInt(max);
            Range r =mappa.get(percentile);
            return r.getValMax();
        }
    
        public HashMap getMappa() {
            return mappa;
        }
    
        public void setMappa(HashMap mappa) {
            this.mappa = mappa;
        }
    
        public RandomGenerator(int[][] distribuzioneOriginale ){
            ArrayList listaRange = new ArrayList();
            int previous = 0;
            int totaleOccorrenze = 0;
            for (int riga = 0; riga < distribuzioneOriginale.length; riga++) {
    
                Range r = new Range();
                r.setValMin(previous);
                r.setValMax(distribuzioneOriginale[riga][0]);
                r.setOccorrenze(distribuzioneOriginale[riga][1]);
                totaleOccorrenze += distribuzioneOriginale[riga][1];
                previous = distribuzioneOriginale[riga][0];
    
                listaRange.add(r);
            }
    
    
    
            int indice = 0;
            for (int iRange = 0; iRange < listaRange.size(); iRange++) {
                Range r = listaRange.get(iRange);
    
                int perc = (int) ( 1000* (r.getOccorrenze() / (double)  totaleOccorrenze)  )  ;
    
                for (int i = 0; i < perc; i++) {
                    mappa.put( i + indice  , r);
                }
                indice += perc;
            }
    
            max = indice;
    
        }
    
    
    
        class Range{
            int valMin;
            int valMax;
            int occorrenze; 
    
    
            public int getValMin() {
                return valMin;
            }
            public void setValMin(int valMin) {
                this.valMin = valMin;
            }
            public int getValMax() {
                return valMax;
            }
            public void setValMax(int valMax) {
                this.valMax = valMax;
            }
            public int getOccorrenze() {
                return occorrenze;
            }
            public void setOccorrenze(int occorrenze) {
                this.occorrenze = occorrenze;
            }  
    
        }
    }
    

提交回复
热议问题