首页 新闻 会员 周边

如何高效取不重复随机数且使和满足特定范围?

0
悬赏园豆:20 [已解决问题] 解决于 2009-12-18 14:39

如题:碰到这样一个问题,如何高效取不重复的特定数目的随机数,且使得这些随机数的和在一个特定范围?我试着写了下面一段代码,请各位达人给予指教,如何高效,如何处理不成立的条件,即:在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)。

等待高手支招!

草羹的主页 草羹 | 初学一级 | 园豆:180
提问于:2009-12-02 16:14
< >
分享
最佳答案
0

“和”的范围不是固定的,没有比较好的算法。

收获园豆:10
一滴血 | 小虾三级 |园豆:1602 | 2009-12-02 16:54
其他回答(1)
0

代码
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;
}

 

收获园豆:10
邀月 | 园豆:25475 (高人七级) | 2009-12-02 16:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册