Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 我如何洗牌列表_List_Unity3d_Coordinates_Shuffle - Fatal编程技术网

List 我如何洗牌列表

List 我如何洗牌列表,list,unity3d,coordinates,shuffle,List,Unity3d,Coordinates,Shuffle,这段代码是为我在unity中创建的游戏编写的。我有一个包含100个坐标元素的列表,我想为它们实例化一些框。箱子数量应为50%,且完全随机。如果我运行我的脚本,我会得到50%的框,但以默认顺序。我的脚本不洗牌列表中的元素。谢谢你的帮助 // List has 100 elements of coordinates ( x & y) public List<Vector2> ListPosBoxes = new List<Vector2>(); // Sta

这段代码是为我在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);
 }
//列表有100个坐标元素(x&y)
public List ListPosBoxes=新列表();
//开始
void Start()
{
数量框(列表框);
}
//方法显示50%的随机框
作废AMOUNTOFBOX(列表)
{
//获取列表->洗牌->新建列表
列表=随机列表(列表);
对于(int i=0;i

问题是:列表没有混合。

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

有关更多信息:

也许从以下几点开始:

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

void amountofbox(列表)
{
//获取列表->洗牌->新建列表
洗牌列表=洗牌列表(列表);
对于(int i=0;i
我希望这有帮助


同样可以帮助您进行调试的是,将变量记录到某个地方,以便您知道哪里出错了

您正在从高数字运行for循环,并减少i

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

但是for循环中的测试
i小于1
,因此它永远不会运行。在for循环中放置一个
Debug.Log
来测试并翻转操作符

正如前面的答案中所提到的,实际上您有几个错误,但首先是
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;
}
//fisher–yates shuffle
for(int i=0;i
感谢您提出的调试想法。问题就在这一行:for(int i=list.Count;i<1;i--)-->i>1解决问题。尴尬!:D@Paski7事实并非如此。问题不仅在于索引,还在于您正在操作同一个列表,而不是创建一个新列表。检查again@asaf92我检查了我的代码,现在只使用一个列表就可以了。它也适用于两个列表。问题是“好的,只要你不想洗牌ListPosBox属性就可以了,但是我刚才也注意到,
list=shufflist(list)
部分可疑。很尴尬!谢谢你的回答!