我想将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;
}
}
答案 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
的最大值是互斥的(请参阅文档)