@xaiponews

Random как сгенерировать случайные числа но с определенной вероятностью выпадения?

как сгенерировать случайные числа но с определенной вероятностью. Например числа от 1 до 5, но 1 должна выпадать с вероятностью 35%, 2-25%, 3-25%, 4-10%, 5-5%
  • Вопрос задан
  • 850 просмотров
Решения вопроса 2
@dmshar
Эта элементарная задача называется "генерирование дискретных случайных величин с заданным законом распределения". Решается классическим образом.
Сначала разбиваем наш диапазон от 1 до 100 на следующие интервалы:
1-35,36-60,61-85,86-95,96-100.
Затем генерируем число, равномерно распределенное в диапазоне от 1 до 100. Номер интервала, в который это число попадает дает ваши генерируемые цифры - от 1 до 5, причем распределены они в точности по вашей таблице распределения.
Ответ написан
Stalker_RED
@Stalker_RED
dmshar все правильно вам написал, разбивайте число из диапазон 1..100 на интервалы

function foo() {
  let random = Math.floor(Math.random() * 100) + 1; // 1..100
  switch (true) {
    case random < 36: return 1 // 35%
    case random < 61: return 2 // 25%
    case random < 86: return 3 // 25%
    case random < 96: return 4 // 10%
    default: return 5
  }
}


Тест: запустим 10 млн раз и посмотрим распределение
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@WaterSmith
Android-разработчик. Java, Kotlin
Не гарантирую, что это лучший вариант, просто первое, что пришло в голову:
1. Заполнить массив из 100 элементов 35 единиц, 25 двоек, 25 троек, 10 четверок, 5 пятерок.
2. Генерировать случайное число от 0 до 99 и извлекать значение из массива по индексу.
Ответ написан
@xaiponews Автор вопроса
Все готово, все получилось. Может кому - то пригодится

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.Serializable;
import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button cmak = (Button)findViewById(R.id.knopka);
        final TextView ocko = (TextView)findViewById(R.id.okno);

        cmak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ocko.setText(String.valueOf(foo()));
            }

            private Serializable foo(){
                ArrayList<Integer> foo = new ArrayList<>();

                for (int i = 0; i< 2; i++) {
                    double random = Math.floor(Math.random() * 100) + 1;
                    if (random < 36) {
                        foo.add(1);
                    } else if (random < 61) {
                        foo.add(2);
                    } else if (random < 81) {
                        foo.add(3);
                    } else if (random < 96) {
                        foo.add(4);
                    } else if (random < 98) {
                        foo.add(5);
                    }
                }
                return foo;
            }
        });
    }
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
iChar Санкт-Петербург
от 120 000 до 180 000 ₽
Яндекс Москва
от 100 000 до 300 000 ₽
23 янв. 2021, в 21:30
20000 руб./за проект
23 янв. 2021, в 20:57
750 руб./в час