Рандом с заданным приоритетом

Данный рандом предназначен для работы с массивами, в текущем виде реализовано взаимодействие с массивами типа: float, string, Color, int. Суть работы заключается в следующем. Например, у нас есть массив типа string с десятью элементами, нам нужно в случайном порядке заполнить его тремя разными словами, при этом число слов должно быть строго определенное. То есть, допустим, пять раз одно слово, два раза другое и три раза третье. В сумме, количество должно соответствовать длине массива. При этом, сами элементы в массив должны быть добавлены в случайном порядке. Иначе говоря, если надо чтобы в 5 случаях из 10 выпало значение 120, в 3 случаях из 10 значение 50, в 2-х из 10 чтобы выпало 1.

Итак, в папку со скриптами кидаем скрипт RandomPriority:

using UnityEngine;
using System.Collections;

public class RandomPriority : MonoBehaviour {

	//////////// блок float ////////////
	public static float[] GetRandom(int[] chances, float[] value, float[] current)
	{
		if(chances.Length != value.Length) return current;

		int[] tmp_chances = new int[chances.Length];
		chances.CopyTo(tmp_chances, 0);

		for(int i = 0; i < current.Length; i++)
		{
			int j = Get(tmp_chances);

			if(j > -1)
			{
				current[i] = Value(tmp_chances, value, j);
			}
		}

		return current;
	}

	static float Value(int[] chances, float[] value, int current)
	{
		float j = 0;

		for(int i = 0; i < chances.Length; i++)
		{
			if(i == current) j = value[i];
		}

		return j;
	}

	//////////// блок string ////////////
	public static string[] GetRandom(int[] chances, string[] value, string[] current)
	{
		if(chances.Length != value.Length) return current;

		int[] tmp_chances = new int[chances.Length];
		chances.CopyTo(tmp_chances, 0);

		for(int i = 0; i < current.Length; i++)
		{
			int j = Get(tmp_chances);

			if(j > -1)
			{
				current[i] = Value(tmp_chances, value, j);
			}
		}

		return current;
	}

	static string Value(int[] chances, string[] value, int current)
	{
		string j = string.Empty;

		for(int i = 0; i < chances.Length; i++)
		{
			if(i == current) j = value[i];
		}

		return j;
	}

	//////////// блок color ////////////
	public static Color[] GetRandom(int[] chances, Color[] value, Color[] current)
	{
		if(chances.Length != value.Length) return current;

		int[] tmp_chances = new int[chances.Length];
		chances.CopyTo(tmp_chances, 0);

		for(int i = 0; i < current.Length; i++)
		{
			int j = Get(tmp_chances);

			if(j > -1)
			{
				current[i] = Value(tmp_chances, value, j);
			}
		}

		return current;
	}

	static Color Value(int[] chances, Color[] value, int current)
	{
		Color j = Color.clear;

		for(int i = 0; i < chances.Length; i++)
		{
			if(i == current) j = value[i];
		}

		return j;
	}

	//////////// блок int ////////////
	public static int[] GetRandom(int[] chances, int[] value, int[] current)
	{
		if(chances.Length != value.Length) return current;

		int[] tmp_chances = new int[chances.Length];
		chances.CopyTo(tmp_chances, 0);

		for(int i = 0; i < current.Length; i++)
		{
			int j = Get(tmp_chances);

			if(j > -1)
			{
				current[i] = Value(tmp_chances, value, j);
			}
		}

		return current;
	}

	static int Value(int[] chances, int[] value, int current)
	{
		int j = 0;

		for(int i = 0; i < chances.Length; i++)
		{
			if(i == current) j = value[i];
		}

		return j;
	}

	//////////// общий блок ////////////
	static int Get(int[] ch)
	{
		int all = 0;
		foreach(int c in ch) all += c;
		int lr = 0;
		int r = Random.Range(0, all);

		for(int i = 0; i < ch.Length; i++)
		{
			if(ch[i] > 0)
			{
				if(r >= lr && r < lr + ch[i])
				{
					ch[i]--;
					return i;
				}
				else lr += ch[i];
			}
		}

		return -1;
	}
}

Готово. Обращаться к нему будем из других скриптов.

Пример использования:

Допустим есть массив Color:

public Color[] colors = new Color[10];

Теперь задаем значения и обращаемся к функции скрипта:

void Start () 
{
	int[] index = {5, 3, 2}; // указываем сколько раз должен выпасть тот или иной элемент
	Color[] col = {Color.red, Color.green, Color.yellow}; // указываем значения выпадающих элементов
	colors = RandomPriority.GetRandom(index, col, colors);
}

Мы получим следующий результат: пять красных элементов, три зеленых, два желтых.

Скачать скрипт:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика