我如何随机播放列表

时间:2020-05-04 12:55:21

标签: list unity3d coordinates shuffle

此代码用于我统一创建的游戏。我有一个包含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 个答案:

答案 0 :(得分:1)

我认为问题在于您正在尝试重新声明参数。

有关更多信息: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;
 }

我希望这会有所帮助。

还可以帮助您进行调试的是,将变量记录到某个位置,以便您知道哪里出错了。

答案 1 :(得分:1)

您正在从大数字开始运行for循环并减少i。

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

但是for循环中的测试是i smaller than 1,因此它永远不会运行。将Debug.Log放入for循环中以测试并翻转运算符

答案 2 :(得分:0)

您实际上有几个错误,如前面的答案中所述,但首先,Random.Range(0, list.Count);实际上有偏见,请检查this link以更好地了解原因。

这是更正的代码:

// 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;
}