Синтаксис:
Используется csharp
using UnityEngine;
public class FRandom
{
public int[] chances;//массив индексов
public FRandom(int[] c){chances = c;}
public int Get()
{
int all = 0;//общее число шансов
foreach(int c in chances)all+=c;
int lr = 0;//начало отсчета от предыдущего шанса
int r = Random.Range(0, all);//берется случайное число из общего количества шансов
for(int i = 0; i < chances.Length; i++)
{
if(chances[i] > 0)//если имеется шанс на выпадение индекса, идем дальше
{
if(r >= lr && r < lr + chances[i])//если случайное число находится в границах индекса...
{
chances[i]--;//убираем один шанс у индекса
return i;//возвращаем индекс
}
else lr += chances[i];//или прибавляем шансы от индекса к предыдущим шансам
}
}
return -1;//если массив индексов пуст или исчерпаны все шансы, возвращаем -1
}
}
public class FRandom
{
public int[] chances;//массив индексов
public FRandom(int[] c){chances = c;}
public int Get()
{
int all = 0;//общее число шансов
foreach(int c in chances)all+=c;
int lr = 0;//начало отсчета от предыдущего шанса
int r = Random.Range(0, all);//берется случайное число из общего количества шансов
for(int i = 0; i < chances.Length; i++)
{
if(chances[i] > 0)//если имеется шанс на выпадение индекса, идем дальше
{
if(r >= lr && r < lr + chances[i])//если случайное число находится в границах индекса...
{
chances[i]--;//убираем один шанс у индекса
return i;//возвращаем индекс
}
else lr += chances[i];//или прибавляем шансы от индекса к предыдущим шансам
}
}
return -1;//если массив индексов пуст или исчерпаны все шансы, возвращаем -1
}
}
Как он работает: В начале имеется массив с шансами на выпадение какого-либо индекса из массива(которые впоследствии используются в скриптах), при вызове функции Get() начинается расчет выпадающего индекса: считается общее количество шансов, затем отсюда берется случайное число, и, если случайное число входит в границы шансов индекса, возвращается выпавший индекс, или, если исчерпаны все возможные варианты или массив пуст, возвращается -1. При исчерпании всех шансов массив индексов обновляется.
Пример работы:
Синтаксис:
Используется csharp
Color red, yellow, green;//Имеется 3 цвета
Color[] mat = new Color[100];//так же имеется массив с цветами, который нужно заполнить тремя цветами в случайном порядке
redChance = 50;//шанс выпадения красного 50 из 100, т.е. 50%
yellowChance = 45;//шанс выпадения желтого 45%
greenChance = 5;//шанс выпадения зеленого 5%
FRandom fr;//инициализируется переменная рандома
void Start()
{
fr = new FRandom(new int[]{redChance, yellowChance, greenChance});//задаем массив с шансами
for(int i = 0; i < mat.Lenght; i++)
{
int ind = fr.Get();//берем случайный индекс
if(ind > -1)//если индекс равен -1, значит закончились шансы
{
swith(ind)//заполняем элемент массива цветом
{
case 0:
mat[i] = red;
break;
case 1:
mat[i] = yellow;
break;
case 2:
mat[i] = green;
break;
}
}
}
}
Color[] mat = new Color[100];//так же имеется массив с цветами, который нужно заполнить тремя цветами в случайном порядке
redChance = 50;//шанс выпадения красного 50 из 100, т.е. 50%
yellowChance = 45;//шанс выпадения желтого 45%
greenChance = 5;//шанс выпадения зеленого 5%
FRandom fr;//инициализируется переменная рандома
void Start()
{
fr = new FRandom(new int[]{redChance, yellowChance, greenChance});//задаем массив с шансами
for(int i = 0; i < mat.Lenght; i++)
{
int ind = fr.Get();//берем случайный индекс
if(ind > -1)//если индекс равен -1, значит закончились шансы
{
swith(ind)//заполняем элемент массива цветом
{
case 0:
mat[i] = red;
break;
case 1:
mat[i] = yellow;
break;
case 2:
mat[i] = green;
break;
}
}
}
}
В результате работы этого скрипта выпадет 50 красных, 45 желтых и 5 зеленых цветов в случайном порядке.
Спасибо за внимание