dima9595
@dima9595
Junior PHP

Случайный рандом с коэффициентом шанса, как сделать?

Всем привет.

Работаю над одним скриптом в игре, но не пойму как правильно сделать, так как в C++ очень слаб. Подскажите пожалуйста.

Суть такова: есть скрипт на действие, при котором должно выдать один из несколько предметов. Но при этом у каждого этого предмета есть разный шанс выпадения.

Я додумался сделать совсем простым вариантом без коэффициента шанса.
override void ChanceItemDrop()
    {
        string itemsRandom[] = {
            "a", "b", "c", "d", "e"
        };

		int min = 0;
    	        int max = 5;
		int intRandom = Math.RandomInt(min, max);   // Получаем случайное число от 0 до 5

                string randItems = itemsRandom[intRandom];  // Получаем предмет из массива "itemsRandom" с помощью рандома "intRandom"

		if(randItems == "a"){
			// Выдаём a
		}else if(randItems == "b"){
			// Выдаём b
		}else if(randItems == "c"){
			// Выдаём c
		}else if(randItems == "d"){
			// Выдаём d
		}else{
			// Выдаём предмет (e)
		}

		// Здесь я выдаю предмет
    }


И это вприницпи работает. Как мне сделать так, что бы у каждого предмета можно было выставлять определённый коофицент выпадения? Или хотя бы подскажите куда копать, в каком направлении.

Заранее спасибо.
  • Вопрос задан
  • 3167 просмотров
Пригласить эксперта
Ответы на вопрос 3
myjcom
@myjcom Куратор тега C++
И это вприницпи работает. Как мне сделать так, что бы у каждого предмета можно было выставлять определённый коофицент выпадения? Или хотя бы подскажите куда копать, в каком направлении.

Смотри:
В урну поместили 2 шара: черный и белый, какова вероятность того, что первый наугад вынутый шар окажется белым?

Дальше

В урну поместили три шара: белый, черный и красный, какова вероятность того, что первый наугад вынутый шар окажется белым?

Дальше
В урну поместили четыре шара: 2 белых, черный и красный, какова вероятность того, что первый наугад вынутый шар окажется белым?

Учитывай что полная вероятность равна 1.0

Вот так это работает, а все остальное вздор... .

Другими словами тебе нужно N штук каждого элемента пропорционально твоему коэфиценту выпадения. Потом https://en.cppreference.com/w/cpp/algorithm/random...

А дальше рандомно дёргать из контейнера, оставлять их там или удалять зависит от задачи.

Использовать распределения или нет аналогично. https://en.cppreference.com/w/cpp/numeric/random

Более сложные варианты я описывать не возьмусь.
Ответ написан
Комментировать
twobomb
@twobomb
Можно типа такого
double getRand(){//возвращает рандом от 0 до 1
    return (double)rand()/(double)RAND_MAX;
}

string ChanceItemDrop(){
        string itemsRandom[] = {
            "a", "b", "c", "d", "e"
        };
        
        float itemsChance[] = {
            .30f, .80f, .50f, .30f, .40f //шансы от 0 до 1,  1 -100% , 0 - 0%
        };
        int arrLen = sizeof(itemsChance)/sizeof(*itemsChance);
        double r;
        int arrSize;
        do{
            r = getRand();
            arrSize = 0;
            for(int i=0;i < arrLen;i++)
                arrSize += r <= itemsChance[i]?1:0;
        }while(arrSize == 0);
        int* inxs= new int[arrSize];
        for(int i=0,p = 0;i < arrLen;i++)
            if(r <= itemsChance[i])
                inxs[p++] = i;
        string result = itemsRandom[inxs[(int)floor(getRand()*arrSize)]];
        free(inxs);
        return result;
    }
Ответ написан
Комментировать
@vanyamba-electronics
float number = ((float) rand()) / MAX_RAND; // число от 0.0 до 1.0
if (number > 0.9)
   cout << "yes" << endl;
else
   cout << "no" << endl;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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