总和固定的多个随机数

xuhaoee 2017-05-16 12:21:57
Project需要生成16个随机数,但总和固定为4095.

目前使用的方法是先在0-MAX(初始MAX=4095)间random一个数,然后用总和减去这个数,得到新的最大值,再在0到MAX之间random一个数,依此类推,但是这样产生的16个数,最后几个数总和非常低,甚至都是0;分析得知,第一个数的随机的均值是2048,第二个数均值是1024,...,所以这种方法随机对各个数来说均值不等,

想请教下,有没有什么方法能够保证:
(1)生成N个随机数,且总和固定MAX;
(2)每个随机数的均值是固定的;
(3)每个数的可能选择的最大值是MAX,最小值是0;
...全文
1436 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuhaoee 2017-05-16
  • 打赏
  • 举报
回复
引用 1 楼 wanggui2015 的回复:
在0-4095之间随机15个数,排序,这15个数将0-4095分为16个区间,取每个区间的范围长度就是你要的16个随机数
多谢,有用!
自信男孩 2017-05-16
  • 打赏
  • 举报
回复
引用 1 楼 wanggui2015 的回复:
在0-4095之间随机15个数,排序,这15个数将0-4095分为16个区间,取每个区间的范围长度就是你要的16个随机数
这个办法也是比较可行的~
wallesyoyo 2017-05-16
  • 打赏
  • 举报
回复
在0-4095之间随机15个数,排序,这15个数将0-4095分为16个区间,取每个区间的范围长度就是你要的16个随机数
starytx 2017-05-16
  • 打赏
  • 举报
回复
仅供参考
#define MAX_NUM 4095		// 总和
#define NUM 16			// 随机数总个数
#define BLOCK 5			// 分的块数,如果觉得随机数不均匀,可以调大块数

int _tmain(int argc, _TCHAR* argv[])
{
	srand((unsigned)time(0));
	int num = MAX_NUM;
	int numPerBlock = NUM/BLOCK;
	int test = 0;		// 测试随机结果是否正确
	for (int k = 0; k < BLOCK; ++k)
	{
		int n = MAX_NUM / BLOCK;
		for (int i = 0; i < numPerBlock; ++i)
		{
			int nTemp = 0;
			if (i == numPerBlock - 1 && NUM%BLOCK == 0)
			{
				nTemp = n;
			}
			else
				nTemp = rand() % (n - (numPerBlock - i)+1) + 1;
			printf("第%d个= %d\n", k*numPerBlock +i+1, nTemp);
			test += nTemp;
			n -= nTemp;
			num -= nTemp;
		}
	}

	// 处理余下的
	for (int m = 0; m < NUM%BLOCK;++m)
	{
		int nTemp = 0;
		if (m == NUM%BLOCK - 1)
		{
			nTemp = num;
		}
		else
			nTemp = rand() % (num  - (NUM%BLOCK -m) + 1) + 1;
		printf("第%d个= %d\n", numPerBlock*BLOCK + m + 1, nTemp);
		test += nTemp;
		num -= nTemp;
	}
	test == MAX_NUM ?printf("随机结果正确!\n"):printf("随机结果有误!\n");
	return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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