产生n个随机数,且那个随机数和为定值?

Joetao 2010-12-27 10:21:01
如题!这个怎么做?先谢谢大家了!
...全文
2240 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jcx396158820 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 litaoye 的回复:]
方法很多,随机生成n-1个小于等于m的数,排个序,最前面补个0,最后面补个m,这n+1个数相邻的差共n个数,和为m

比如n=5,m=40,随机4个小于40的数,38,12,27,1,排个序1 12 27 38,前面补0后面补m,0 1 12 27 38 40
5个数为相邻2项的差,1,11,15,11,2
[/Quote]
+1
danjiewu 2010-12-28
  • 打赏
  • 举报
回复
lz的要求不够明确啊,n个数可以有重复的吗?
龍过鸡年 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 litaoye 的回复:]

方法很多,随机生成n-1个小于等于m的数,排个序,最前面补个0,最后面补个m,这n+1个数相邻的差共n个数,和为m

比如n=5,m=40,随机4个小于40的数,38,12,27,1,排个序1 12 27 38,前面补0后面补m,0 1 12 27 38 40
5个数为相邻2项的差,1,11,15,11,2
[/Quote]

有道理!
phil999 2010-12-28
  • 打赏
  • 举报
回复
楼主可能要的是这种效果:

给定 sum 和 n,
第一步:生成包含 n 个数的序列,其中每个数都是 sum/n,

第二步:给“每一对”加上随机的偏移量,比如:
offset = rnd.next();
numbers[0] = numbers[0] + offset;
numbers[1] = numbers[1] - offset;

第三步不是必须的,但是如果你追求好看,就把这个序列打乱,让它看起来像是随机的
绿色夹克衫 2010-12-28
  • 打赏
  • 举报
回复
方法很多,随机生成n-1个小于等于m的数,排个序,最前面补个0,最后面补个m,这n+1个数相邻的差共n个数,和为m

比如n=5,m=40,随机4个小于40的数,38,12,27,1,排个序1 12 27 38,前面补0后面补m,0 1 12 27 38 40
5个数为相邻2项的差,1,11,15,11,2
wuyq11 2010-12-27
  • 打赏
  • 举报
回复
var r = from a in Enumerable.Range(1, n)
from b in Enumerable.Range(a, n)
from c in Enumerable.Range(b, n)
where a + b + c < n
select new { A = a, B = b, C = c };
rabbitlzx 2010-12-27
  • 打赏
  • 举报
回复
如果和为100,则先产生前n-1个随机数,第n个随机数就是100减去前99个随机数之和
极地_雪狼 2010-12-27
  • 打赏
  • 举报
回复
比如定值为A,那么就以 A/n 作为随机数的最大值,生成n-1个随机数,最后一个随机数采用A减去前面n-1个随机数的和的方式生成,不就OK了吗?
zhq_152718 2010-12-27
  • 打赏
  • 举报
回复
用递归吧,第i一个随机数范围的最大值取定数减去前i-1个数的和的值
bloodish 2010-12-27
  • 打赏
  • 举报
回复

List<int> result = GetResult(2000, 10);
static List<int> GetResult(int sum, int count)
{
int[] array = Enumerable.Range(0, sum).ToArray();
List<int> result = new List<int>(count);
int remain;
while (true)
{
remain = sum;
while (result.Count < count - 1)
{
int avg = (remain / (count - result.Count));
//根据鸽笼原理,必须有一个值在范围
//avg + Environment.TickCount % (remain - avg)之内
int value = array[avg + Environment.TickCount % (remain - avg)];
result.Add(value);
remain -= value;
}
result.Add(sum - result.Sum());

//如果都不相同,表明取值成功,否则重新取值
if (result.Distinct().Count() == result.Count)
{
break;
}
else
{
result.Clear();
}
}
return result;
}

Iovswety 2010-12-27
  • 打赏
  • 举报
回复
public static void Main(string[] args)
{
int sum = 100;
int count = 5;
int n = 0;
Random rd = new Random();
for (int i = 1; i <= count - 1; i++)
{
do
{
n = rd.Next(1,sum);
}
while (n > sum + i - count);
sum = sum - n;
Console.Write(n + " ");
}
Console.Write(sum);
Console.ReadKey();
}
sagaspog 2010-12-27
  • 打赏
  • 举报
回复
随机的范围啊
和为100

那么第一个数的范围在100-0之间
第二个数就在0-(100-第一个数)
最后一个数就是100-前5个数的和

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧