很多人开发过牌类游戏
开发游戏过程中有个问题终会遇到 就分配牌
其实也就是将数组下标和内容随机打乱的问题
很多人是这样解决的 另外声明个同等大小的数组 然后用for循环随机数取值 取到的值 放到新的数值里 当然 还要判断下是不是数组里已经 出现过这个数 因为一副牌不可能有两张同样的牌
用C# .net的代码表达以上方法就是:
int[] numbers= new int[]{1,2,3,4,5};
int[] randNumbers = new int[numbers.Length];
for(int i = 0; i < numbers.Length; i++)
{
int randIndex = 0;
while(true)
{
Random ra = new Random();
randIndex = ra.Next(numbers.Length);
bool isInclude = true;
for(int j = 0; j < numbers.Length; j++)
{
if(numbers[randIndex] == randNumbers[j] )
{
isInclude = true;
break;
}
}
if(!isInclude)
{
break;
}
}
randNumbers[i] = numbers[randIndex];
}
这是传统方法
这种方法的缺陷就是 方法越到后面randNumbers的取值越困难 因为重复的可能性越大
我测试过最糟糕的一次是10个数 用了随机数150次 判断1000余次
这样的效率没人会说高
当然上面的方法 是为了引出 今天的主题:
高效的随机数组取值方法
int[] numbers= new int[]{1,2,3,4,5};
int[] p = new int[numbers.Length];
int[] randNumbers = new int[numbers.Length];
for(int i = 0; i < numbers.Length;i ++)
{
p[i] = i;
}
for(int i = 0;i < numbers.Length;i++)
{
Random ra = new Random();
int randIndex = ra.Next(numbers.Length - i);
randNumbers[i] = numbers[p[randIndex]];
for(int j = randIndex; j < numbers.Length;j++)
{
p[j] = j == numbers.Length - 1 ? 0 : p[j + 1];
}
}
这个方法的原理是将随机数出现过的从 数组下标数组中移除 避免再次随机到