Unity中的随机数组

时间:2016-04-18 19:18:38

标签: c# function unity3d unityscript

我想将array变量中的数字混洗一次,因此我从Shuffle调用了Start()方法。

然后我尝试从更新中访问shuffled数组,但我无法这样做。我该如何访问它?有没有其他方法可以将我的阵列洗牌一次,然后永远使用它?

private System.Random _random = new System.Random();
float sec;
float timecount;
float starttime;
void Start () {
    starttime = Time.time;
    int[] array = { 1, 2, 3, 4, 5, 6, 7, 8};
    Shuffle(array);
    foreach (int value in array)
    {
        Debug.Log(value);
    }
}

void Update () {
    //time
    timecount = Time.time - starttime;
    sec = (timecount % 60f);
    if (Mathf.Round(sec) == 3f) {
        //access shuffled array
        Debug.Log(array[3]);  <=====error here
    }
}

//for shuffle number from array
void Shuffle(int[] array){
    int p = array.Length;
    for (int n = p-1; n > 0 ; n--)
    {
        int r = _random.Next(1, n);
        int t = array[r];
        array[r] = array[n];
        array[n] = t;
    }
}

3 个答案:

答案 0 :(得分:2)

目前,您的数组已在Start()函数中声明。这意味着只能从Start()函数中访问它。如果您希望能够从Start()Update()访问数组,则需要通过全局声明来扩大其范围。例如:

private System.Random _random = new System.Random();
float sec;
float timecount;
float starttime;

//declare array globally
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8};

void Start () 
{
  starttime = Time.time;
  Shuffle(array);
  foreach (int value in array)
  {
      Debug.Log(value);
  }
}

void Update () 
{
    //now you can access array here, because it is declared globally
}

此外,请查看有关C#范围的this MSDN article

答案 1 :(得分:2)

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8};移到“开始”功能之外。

private System.Random _random = new System.Random();
float sec;
float timecount;
float starttime;

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };

void Start()
{
    starttime = Time.time;
    Shuffle(array);
    foreach (int value in array)
    {
        Debug.Log(value);
    }
}

void Update()
{
    //time
    timecount = Time.time - starttime;
    sec = (timecount % 60f);
    if (Mathf.Round(sec) == 3f)
    {
        //access shuffled array
        Debug.Log(array[3]);
    }
}

//for shuffle number from array
void Shuffle(int[] array)
{
    int p = array.Length;
    for (int n = p - 1; n > 0; n--)
    {
        int r = _random.Next(0, n);
        int t = array[r];
        array[r] = array[n];
        array[n] = t;
    }
}

编辑与您的问题无关

您的随机播放功能存在错误。 array[0]始终保持 1 ,永远不会改变。要解决此问题,请在随机播放功能中将int r = _random.Next(1, n);替换为int r = _random.Next(0, n);

答案 2 :(得分:0)

该算法仍然存在问题。想象一个值为0、1、2的数组 可能的改组应该是:

0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0

,每种情况的可能性应该相同。要实现此修改 int r = _random.Next(0, n+1);因为Random.Next的最大值是互斥的(请参阅文档)