Народ как заставить рандом работать с вероятностю в java???

народ как заставить рандом работать с вероятностю в java???
например:
String [] x = { "a", "b", "c"};
Double [] y = {0.12, 0.38, 0.5};
чтобы randome брал значения из стрингового массива с вероятностью дабл массива!
  • Вопрос задан
  • 867 просмотров
Решения вопроса 1
@toxkox Автор вопроса
public static void main(String[] args) {
String [] x = { "a", "b", "c"};
Double [] y = {0.23, 0.27, 0.5};
Random rand = new Random();
Double number = rand.nextDouble();
int Index = 0;
for (int i = 0; i < y.length; i++)
{
if (number <= y[i])
{
Index = i;
break;
}
y[i + 1] += y[i];
}
System.out.println(x[Index]);
}
}
спасибо Кандрашкину Алексею!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Только через поиск НОД и кол-во элементов в серии в соответствии с НОД.
В примере: НОД = 0.02 т.е. серия = 50 элементам.
Кол-во элементов в соответствии с вероятностью (просто разобрать очередь, предварительно её перемешав - shuffle):
a=6
b=19
c=25
Ответ написан
@odissey_nemo
Программист, ГИС-системы, растры, космоснимки
// JAVA code

    public static void main( String[] args ) throws Exception
    {
        for(int num: new int[]{10,100,1000, 10000,100000,1000000})
            probByNum( num );
    }

    private static void probByNum( int num )
    {
       //final char[] chars = { 'а', 'б', 'в' };
        final double[] probs  = { 0.12d, 0.5d, 1.0d }; // cumulative probability for each value

        int[] res = new int[ 3 ];

        Random rnd = new Random( ( new Date() ).getTime() ); // each time different seed
        for ( int i = 1; i <= num; i++ )
        {
            double prob = rnd.nextDouble();
            for ( int j = 0; j < 3; j++ )
            {
                if ( prob < probs[ j ] )
                {
                    res[ j ]++; // count detected probability
                    break;
                }
            }
        }

        System.out.println(
            String.format( Locale.ENGLISH,"Probability with %10d trials to hit 0.120, 0.380, 0.500 is: %4.3f, %4.3f, %4.3f",
                num,
                ( ( ( double ) res[ 0 ] ) / ( double ) num ),
                ( ( ( double ) res[ 1 ] ) / ( double ) num ),
                ( ( ( double ) res[ 2 ] ) / ( double ) num ) ) );
    }
// Results:
Probability with         10 trials to hit 0.120, 0.380, 0.500 is: 0.100, 0.200, 0.700
Probability with        100 trials to hit 0.120, 0.380, 0.500 is: 0.080, 0.410, 0.510
Probability with       1000 trials to hit 0.120, 0.380, 0.500 is: 0.122, 0.375, 0.503
Probability with      10000 trials to hit 0.120, 0.380, 0.500 is: 0.124, 0.377, 0.499
Probability with     100000 trials to hit 0.120, 0.380, 0.500 is: 0.122, 0.377, 0.501
Probability with    1000000 trials to hit 0.120, 0.380, 0.500 is: 0.119, 0.380, 0.501
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы