【求助】c#随机数不重复问题
unity3d吧
全部回复
仅看楼主
level 3
canondj 楼主
原本是打算每次点击button,产生一个随机数
使用unity自带的Random.Range()方法取随机数,发现会有重复的
求吧友大牛们,提供下思路,先谢谢啦[乖]
2015年01月24日 02点01分 1
level 6
记得是要在前面加上一句初始化随机数的过程,具体名称我不懂,你去百度吧
2015年01月24日 04点01分 3
level 7
初始化一个范围的数加到一个list中,每次随机list长度元素,随机取出一个数,并把这个数从list中删除,反复操作直到list为空,重新生成list
2015年01月24日 15点01分 4
+1
2015年01月26日 05点01分
level 3
canondj 楼主
2015年01月25日 03点01分 5
level 11
我记得有真随机和家随机,在c里边不知道.net是不是也是这样。如果每次去比较性能太差
2015年01月26日 02点01分 8
嗯嗯,random算是伪随机,我在写一个小程序demo所以每次比较就够用啦
2015年01月26日 04点01分
回复 canondj :嗯嗯,如果数据多了就不好办了
2015年01月26日 04点01分
level 2
随机数+系统当前时间和比如,随机数取得5,就是当前时间:2015.1.26 10:03:51:550(就是年月日时分秒毫秒)
随机数=5+2015+1+26+10+3+51+550=2661
这样绝对不会重复,因为时间是每时每刻的增加,而且因为是玩家点击,不可能速度超过毫秒的精确程度
2015年01月26日 02点01分 9
level 2
随机数+系统当前时间和比如,随机数取得5,加上当前时间:2015.1.26 10:03:51:550(就是年月日时分秒毫秒)
随机数=5+2015+1+26+10+3+51+550=2661
这样绝对不会重复,因为时间是每时每刻的增加,而且因为是玩家点击,不可能速度超过毫秒的精确程度
2015年01月26日 02点01分 10
level 12
public class RandomUtil {
/**
* 在范围内取得过滤列表里没有的随机值
*/
public static int Range(int start, int end, List<int> filter) {
if (filter == null || filter.Count == 0) {
return Random.Range(start, end);
}
int validCount = 0;
for (int n = start; n < end; n ++ ) {
if (!filter.Contains(n)) {
validCount++;
}
}
if (validCount == 0) {
Debug.LogError("Random range invalid");
return start - 1;
}
int result = Random.Range(start, end);
while (filter.Contains(result)) {
result = Random.Range(start, end);
}
return result;
}
/**
* 取得start-end范围内的size个不重复随机数,不包括end本身
*
*/
public static int[] NonRepetitiveRange(int start, int end, int size) {
if (size <= 0 || end <= start || size > end - start) {
return new int[0];
}
string tempStr = "";
int[] result = new int[size];
for (int i = 0; i < size; i++) {
int n = Random.Range(start, end);
while (tempStr.IndexOf("_" + n + "_") != -1) {
n = Random.Range(start, end);
}
tempStr += "_" + n + "_";
result[i] = n;
}
tempStr = null;
return result;
}
/**
* 随机取得array内不重复的n个数
*/
public static int[] NonRepetitiveArray(int[] array, int size) {
if (size <= 0 || size > array.Length) {
return new int[0];
}
int[] indexs = NonRepetitiveRange(0, array.Length, size);
int[] result = new int[size];
for (int i = 0; i < size; i++) {
result[i] = array[indexs[i]];
}
return result;
}
}
2015年01月26日 13点01分 12
level 1
[DllImport("kernel32.dll")]
public extern static short QueryPerformanceCounter(ref long x);
用这个函数生成随机种子,如果需要安全级别较高的话,就调用这个函数4次,每次取最低1个字节,然后将4个字节组合成一个32位整数,再用这个整数作为随机种子。
2025年03月18日 04点03分 13
level 1
用dowhile循环,记录上次和这次的,一样就再循环,别忘了覆盖更新这次
2025年04月08日 07点04分 14
1