Как упоминалось в комментарии к вашему вопросу, вероятно, проще всего просто перетасовать числа в диапазоне [1,50], а затем взять первые 25 или сколько угодно.
Причина, по которой ваш код работает неправильно, и вы видите много повторов, потому что вы вызываете функцию RandomValue () несколько раз по отдельности, а переменная списка, с которой вы сравниваете, если значение уже находится на диаграмме, находится внутри этой функции. Это означает, что он будет проверять только значения, сгенерированные в этом вызове, в данном случае это означает только одну строку.
Кроме того, если вы составляете список, который, как вы знаете, всегда будет одного размера, вам следует вместо этого используйте массив. Списки предназначены для случаев, когда вы хотите, чтобы размер можно было регулировать.
Решение 1:
Очень простой способ сгенерировать массив с числами от 1 до 50:
//Initialize Array
int[] numbers = new int[50];
for (int i = 1; i <= numbers.Length; i++)
{
numbers[i] = i;
}
//Shuffle Array
for (int i = 0; i < numbers.Length; i++ )
{
int tmp = numbers[i];
int r = Random.Range(i, numbers.Length);
numbers[i] = numbers[r];
numbers[r] = tmp;
}
//Get first 'n' numbers
int[] result = Array.Copy(numbers, 0, result, 0, n);
return result;
Я не уверен, что это наиболее эффективный способ, но он сработает.
Решение 2:
Чтобы изменить код для проверки по всему списку, я изменил бы этот раздел:
for (int x = 0; x <= 4; x++)
{
RandomValue(0, x);
RandomValue(1, x);
RandomValue(2, x);
RandomValue(3, x);
RandomValue(4, x);
}
Примерно так:
List<int> values = new List<int>();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int r = RandomValue(1, 50);
while (values.Contains(r))
{
r = RandomValue(1, 50);
}
values[y * width + x].Add(r);
gridArray[x, y] = r;
}
}
int RandomValue(int min, int max) {
return UnityEngine.Random.Range(min, max);
}
Надеюсь, это поможет!