我想生成随机唯一编号。这些是代码:
public int NewNumber(int r) {
int[] numbers = new int[r];
int a = Random.Range (0, r);
if(numbers.Contains(a)) {
a = Random.Range (0, r);
}
return a;
}
当NewNumber(5)工作十次时,我得到的结果如下:5,4,3,4,1,2,4,2,5,3
但我想要的是:5,3,4,2,1
哪里错了?
答案 0 :(得分:0)
每次调用NewNumber方法时,您都在重置持有者,您需要将持有者置于方法之外。
int[] numbers = new int[r];
public int NewNumber(int r) {
int a = Random.Range (0, r);
if(!numbers.Contains(a)) {
a = Random.Range (0, r);
}
return a;
}
如果使用列表而不是数组会更好;
List<int> numbers = new List<int>();
public int NewNumber(int r) {
int a = Random.Range (0, r);
if(!numbers.Contains(a)) {
numbers.Add(a);
}
return a;
}
答案 1 :(得分:0)
如果您不希望返回的范围内只有一个数字,则解决方案不需要数组。如果随机数恰好是您不想要的,则只需重复创建一个新的随机数。
public int RandomNumberInRangeExcluding(int range, int excludedNumber)
{
int r = excludedNumber;
while (r == excludedNumber)
{
r = Random.Range(0, range);
}
return r;
}
答案 2 :(得分:0)
nexx是对的,但除非你将它包裹在一个循环中,否则你仍然会得到重复的东西,比如......
List<int> numbers = new List<int>();
public int NewNumber(int r) {
int a = 0;
while(a==0){
a = Random.Range (0, r);
if(!numbers.Contains(a)) {
numbers.Add(a);
}else{
a=0;
}
}
return a;
}
答案 3 :(得分:0)
我认为这是因为当numbers
包含a
时,您只会随机一次。尝试将if
更改为while
,以便随机播放,直到numbers
不包含a
int[] numbers = new int[r];
public int NewNumber(int r) {
int a = Random.Range (0, r);
while(numbers.Contains(a)) { // change this to while
a = Random.Range (0, r);
}
return a;
}
答案 4 :(得分:0)
这可以达到相同的效果,无需等待Random
有希望吐出任何需要的数字
static void Main(string[] args)
{
List<int> rands = GetRandoms(10);
}
static IEnumerable<int> GetRandoms(int size)
{
List<int> rands = new List<int>();
for (int i = 1; i <= size; i++)
{
rands.Add(i);
}
return rands.OrderBy(i => Guid.NewGuid());
}