Как я могу перемешать список - PullRequest
0 голосов
/ 04 мая 2020

этот код для игры, которую я создаю в единстве. У меня есть список из 100 элементов координат, и я хочу создать для них поля. Количество ящиков должно быть 50%, а общее количество случайных. Если я запускаю свой скрипт, я получаю 50% ящиков, но в порядке по умолчанию. Мой сценарий не тасует элементы в списке. Спасибо за помощь!

 // List has 100 elements of coordinates ( x & y)
 public List<Vector2> ListPosBoxes = new List<Vector2>(); 

 // Start   
 void Start()
 {
     AmountOfBoxes(ListPosBoxes);
 }

 // Method to display 50% shuffled boxes    
 void AmountOfBoxes(List<Vector2> list)
 {
     // Take list -> shuffle -> new list
     list = ShuffleList(list);

     for (int i = 0; i < list.Count/2; i++)
         {
         // Create Box
             BoxGenerator(list[i]);
         }
 }

 // Method to suffle list
 List<Vector2> ShuffleList(List<Vector2> list)
 {
     Vector2 tmp;

     // fisher–yates shuffle
         for (int i = list.Count; i < 1; i--)
         {
             // Pick random Element
             int j = Random.Range(0, list.Count);

             // Swap Elements
             tmp = list[j];
             list[j] = list[i - 1];
             list[i - 1] = tmp;
         }
     return list;
 }

 // Method to create Box
 void BoxGenerator(Vector2 box) 
 {
         CreateBox(box.x, box.y);
 }

Проблема в том, что список не перепутан.

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Вы запускаете свой for-l oop с больших чисел и уменьшаете i.

// fisher–yates shuffle
     for (int i = list.Count; i < 1; i--)

Но тест для l oop равен i smaller than 1, поэтому он никогда не запускается. Поместите Debug.Log в for-l oop для проверки и переверните оператор

1 голос
/ 04 мая 2020

Я думаю, проблема в том, что вы пытаетесь повторно объявить параметр.

Для получения дополнительной информации: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters

Возможно, начните с:

 void AmountOfBoxes(List<Vector2> list)
 {
     // Take list -> shuffle -> new list
     shuffled_list = ShuffleList(list);

     for (int i = 0; i < list.Count/2; i++)
         {
         // Create Box
             BoxGenerator(shuffled_list[i]);
         }
 }

// Method to suffle list
 List<Vector2> ShuffleList(List<Vector2> list)
 {
     Vector2 tmp;
     list *= list;

     // fisher–yates shuffle
         for (int i = list.Count; i < 1; i--)
         {
             // Pick random Element
             int j = Random.Range(0, list.Count);

             // Swap Elements
             tmp = list[j];
             list[j] = list[i - 1];
             list[i - 1] = tmp;
         }
     return list;
 }

Надеюсь, это поможет.

Что может также помочь вам в отладке, так это записать ваши переменные в другом месте, чтобы вы знали, где они пошли не так.

0 голосов
/ 04 мая 2020

У вас есть пара ошибок, как уже упоминалось в предыдущих ответах, но прежде всего, что Random.Range(0, list.Count); на самом деле довольно предвзято, пожалуйста, проверьте эту ссылку , чтобы лучше понять, почему.

А вот исправленный код:

// fisher–yates shuffle     
for (int i = 0; i < list.Count; i++) {

     // Pick random Element
     int j = Random.Range(i, list.Count);

     // Swap Elements
     Vector2 tmp = list[i];
     list[i] = list[j];
     list[j] = tmp;
}
...