如何使用列表中的值而不重复? (Random.Range)

时间:2014-09-25 12:01:26

标签: c# unity3d

我有一个列表(planePosition)。我想随机使用这些列表值而不重复,所以我使用

 for( int a=0; a< planePosition.Count; a++)
    { 
    int r=Random.Range(0,planePosition.Count);
    Newplan.transform.position =  new Vector3 (planePosition[r].x, planePosition[r].y ,9.990011f);
    planePosition.RemoveAt(r);
    }

但我仍然得到重复值..

5 个答案:

答案 0 :(得分:0)

只做

readonly Random _random= new Random(); 


for( int a=0; a< planePosition.Count; a++)
{ 
int r= _random.Range(0,planePosition.Count);
Newplan.transform.position =  new Vector3 (planePosition[r].x, planePosition[r].y ,9.990011f);
planePosition.RemoveAt(r);
}

答案 1 :(得分:0)

没有随机函数可以保证值不会重复两次。这就是为什么它是随机的。这意味着如果你依赖它,你的代码将是脆弱的。

相反,你可以保留一个集合来跟踪使用过的ID

List<int> usedIndexes = new List<int>();

然后有一个获取非重复索引的方法:

private int GetRandomInt(int min, int max)
{
     int num = Random.Range(min, max);

     while(usedIndexes.Contains(num))
     {
          num = Random.Range(min, max);
     }

     return num;
}

答案 2 :(得分:0)

由于我目前的声誉,我无法发表评论。请不要将其视为答案。

我有一些问题:

1) 见juharr的评论。

2) 在这里,您始终(另一个)设置相同的字段/属性:

Newplan.transform.position =  new Vector3 (planePosition[r].x, planePosition[r].y ,9.990011f);

这是你想要的行为吗?

3)通过删除您在列表中使用的值,我认为您确保不再使用它。这与随机无关。如果您始终使用列表的第一个值,这也应该有效。但是:您确定列表中的值是唯一的吗?也许您的问题不在于该方法。相反,它是提供planePosition-list的方法。

答案 3 :(得分:0)

我得到了答案:)

for(int a=0; a<16; a++)
        {


            //rnd = new Random ();
            while (planePosition.Count != 0)
            {
                     int index = Random.Range (0, planePosition.Count-1);
                     randomizedList.Add (planePosition [index]);
                    Newplan.transform.position =  new Vector3 (randomizedList[r].x, randomizedList[r].y ,9.990011f);
                    planePosition.RemoveAt (index);

            }

        }

答案 4 :(得分:0)

  private void ScoreRandomize()
    {
        List<int> listRnd = new List<int>();
        listRnd.AddRange(scoreAmount); //scoreAmount is array or list with orginal data
        for (int i = 0; i < listRnd.Count + i; i++)
        {
            int rnd = UnityEngine.Random.Range(0, listRnd.Count);
            scoreDisplayTxts[i].text = listRnd[rnd].ToString();
            scoreAmount[i] = listRnd[rnd];
            listRnd.RemoveAt(rnd);
        }

    }