如题:碰到这样一个问题,如何高效取不重复的特定数目的随机数,且使得这些随机数的和在一个特定范围?我试着写了下面一段代码,请各位达人给予指教,如何高效,如何处理不成立的条件,即:在1~100中取1个数满足和的范围在1000~2000,这个肯定不成立咯。
static List<int> milist = new List<int>();
static Random mrTmp = new Random();
static int miTmp = 0;
static int miResult = 0;
/// <summary>
/// 例如,从1~100的范围随机10个数,累加的和的范围在150~300之间
/// </summary>
/// <param name="pistart">范围起始值,如1</param>
/// <param name="piend">范围最大值,如100</param>
/// <param name="picount">要找几个数,如10</param>
/// <param name="prstart">累加的结果范围起始值,如150</param>
/// <param name="prend">累加的结果范围最大值,如300</param>
/// <returns></returns>
public static bool FindNumbers(int pistart, int piend, int picount, int prstart, int prend)
{
miTmp = 0;
miResult = 0;
milist.Clear();
while (milist.Count < picount)
{
miTmp = mrTmp.Next(pistart, piend);
//if (milist.FindAll(li => li == liTmp).Count == 0)//v3.0
if (milist.FindAll(new Predicate<int>(delegate(int li)
{
return li == miTmp;
})).Count == 0)
{
miResult += miTmp;
milist.Add(miTmp);
}
}
if (miResult > prend || miResult < prstart)//和不满足指定的范围
{
return FindNumbers(pistart, piend, picount, prstart, prend);
}
else
{
for (int i = 0; i < picount; i++)
Console.WriteLine(milist[i]);
Console.WriteLine(miResult);
return true;
}
}
调用示例:FindNumbers(1, 100, 10, 150, 200)。
等待高手支招!
“和”的范围不是固定的,没有比较好的算法。
public static int getRandomID(int minValue, int maxValue)
{
Random ri = new Random(unchecked((int)DateTime.Now.Ticks));
int k = ri.Next(minValue, maxValue);
return k;
}