如何洗牌列表

问题描述 投票:0回答:1

这段代码是为我在unity中创建的一个游戏编写的。我有一个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);
 }

问题是:列表没有混合。

list unity3d coordinates shuffle
1个回答
1
投票

你正在运行你的for循环从高数字和减少i。

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

但在for循环的测试是 i smaller than 1 所以它永远不会运行。放置一个 Debug.Log 在for-loop中测试并翻转运算符。


1
投票

我认为问题在于你试图重新声明一个参数。

如需了解更多信息。https:/docs.microsoft.comen-usdotnetcsharpprogramming-guideclasses-and-structspassing-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
投票

其实你有几个错误,在前面的回答中也提到过,但首先,那个 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.