如何生成给定数值数组中不存在的数值?
问题描述:
我有这种方法来生成新的数值,但它需要很长时间才能完成该功能。 如何快速生成随机数?如何生成给定数值数组中不存在的数值?
public int GeneratenewID(int[] OptionId)
{
Random ran = new Random();
int SearchId = ran.Next(1, OptionId.Length*2);
if (!OptionId.Contains(SearchId))
{
return SearchId;
}
else
{
return GeneratenewID(OptionId);
}
}
答
这将肯定如此尝试的工作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
int [] OptionId=new int[]
{
0, 1,4,7,3,1,37,9
};
Program p = new Program();
int a= p. GeneratenewID(OptionId);
}
public int GeneratenewID(int[] OptionId)
{
Random ran = new Random(1);
int number = 0;
for (int j = 0; j < OptionId.Length ; j++)
{
number = ran.Next(OptionId.Length);
if (!OptionId.Contains(number))
break;
else
j--;
}
return number;
}
}
}
+0
为什么在'for'语句的两个部分和'for'的主体内部增加'j'?这种方法有什么好处? –
+0
对不起,输入错误... –
+0
为什么要循环?当它通过递归完成时。你可以解释吗。 – Anil
这是几乎可以肯定是一个破碎的洗牌算法。 Google“c#fisher yates shuffle”。 –
退一步说明**为什么**你认为你需要这个。这味道像一个XY问题 - https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem。 – mjwills
将'Random ran = new Random();'从函数中取出,并为随机实例使用一个类字段。随机空构造函数使用系统时间作为种子需要很长时间,而在递归方法中,它会在系统时间改变之前运行几次,所以它会一遍又一遍地产生相同的数字。 –