怎么随机生成5个和为60的数字

写给我自己 2018-01-05 02:44:19
怎么随机生成和为60的数字啊。
我这样写
int a[5];
for(int i =0;i<5;i++)
a[i] =(rand()%60)/5
但是生成的5个数的和不是60啊,还不到30,请问我该这么解决,求大神指教
...全文
1589 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloxkcd 2018-02-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	while(1)
	{
		srand((unsigned)time(NULL));
		int z = 60 / 5;
		int a = rand() % 60 + 1;
		int b = rand() % (60 - a) + 1;
		int c = rand() % (60 - a - b) + 1;
		int d = rand() % (60 - a - b - c) + 1;
		int e = rand() % (60 - a - b - c - d) + 1;
		if(a + b + c + d + e != 60)
		{
			printf("%d + %d + %d + %d + %d != 60.\n",a,b,c,d,e);
			sleep(1);
			continue;
		}
		else
		{
			system("clear");
			printf("%d + %d + %d + %d + %d = 60.\n",a,b,c,d,e);
			char ch = getchar();
			if(ch = 'q')
				break;
			else
				continue;
		}
	}
	return 0;
}
在linux gcc编译器测试时有极小概率出现浮点数例外错误!(猜测使用 -std=c99可解决?)
CT8100 2018-02-08
  • 打赏
  • 举报
回复
准备一个数据库,里面全部存和为60的数据组,然后随机从里面抽取~
「已注销」 2018-02-08
  • 打赏
  • 举报
回复
引用 22 楼 vcf_reader 的回复:
回答都是五花八门。其实很简单的一个笨办法: 产生第一个不大于56的随机数 产生第二个随机数,与第一个求和,和不能大于57,否则重来 …… 产生第四个随机数,与前面三个求和,和不能大于59. 第五个数 = 60 - 前面4个的和。
看楼主的要求了,随机数是否允许重复,是否允许 0 的存在等等。 如果不允许重复的,那么就较为复杂了,判断较多。目前我们就说允许重复吧: 剩余值初始化 n = 56(60 - 4,后面 4 个都为 1 的情况下): 1. 产生随机数 n1 = rand() % n,n -= n1。 2. 产生随机数 n2 = rand() % n,n -= n2。 3. 产生随机数 n3 = rand() % n,n -= n3。 4. 产生随机数 n4 = rand() % n,n -= n4。 5. n5 = 60 - n1 - n2 - n3 - n4; 如果允许存在四个 0 的情况,直接按照 wh_ 的做法就行了。或者将剩余值初始化为 60 即可。
wh_ 2018-02-05
  • 打赏
  • 举报
回复
int n1 = rand()%60; int n2 = rand()%(60-n1); int n3 = rand()%(60-n1-n2); int n4 = rand()%(60-n1-n2-n3); int n5 = 60-(n1+n2+n3+n4);
faihung 2018-02-05
  • 打赏
  • 举报
回复
先随出前4个,再用60减下就行。他们都替你想好了
zhagoodwell 2018-02-05
  • 打赏
  • 举报
回复
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
int main(){
    int A[5]={0},i,N=60,sum=0;
    srand(time(0));
    for(i=0;i<5;i++)
    {
        A[i]=rand()%16;
        sum+=A[i];
    }
    A[rand()%5]+=60-sum;
    for(i=0;i<5;i++)
        printf("%d ",A[i]);
    return 0;
}
vcf_reader 2018-01-28
  • 打赏
  • 举报
回复
回答都是五花八门。其实很简单的一个笨办法: 产生第一个不大于56的随机数 产生第二个随机数,与第一个求和,和不能大于57,否则重来 …… 产生第四个随机数,与前面三个求和,和不能大于59. 第五个数 = 60 - 前面4个的和。
MAYBEALL 2018-01-27
  • 打赏
  • 举报
回复
	int num1,num2,num3,num4,num5;
	num1 = rand()%61;	
	num2 = rand()%(60-num1+1);
	num3 = rand()%(60-num1-num2+1);
	num4 = rand()%(60-num1-num2-num3+1);
	num5 = rand()%(60-num1-num2-num3-num4+1);
	
	printf("%d\t%d\t%d\t%d\t%d\t",num1,num2,num3,num4,num5);
这样,每次取的下个数,只要小于60减去已经取出的数的总和就行
x_xx_xxx_xxxx 2018-01-22
  • 打赏
  • 举报
回复
引用 11 楼 PpBearGoGoGo 的回复:
还有一种思路就是: 1先随机五个数 2按比例算出和为60的时候分别为多少。
哈哈哈哈,11 楼的思路很赞很新颖啊!
AlbertS 2018-01-22
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
那你就随机生成4个随机数,每个最大15,剩下一个的值为60减去前面4个的
靠谱!
赵4老师 2018-01-22
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
插板法?
比如60个球排成一排,0~60共61个,每个可插入0~4个隔板的间隔位置,总共可插入4个隔板,隔出5段,每段包含球的个数即5个和为60的整数。
赵4老师 2018-01-22
  • 打赏
  • 举报
回复
插板法?
狐狸小十 2018-01-20
  • 打赏
  • 举报
回复
先用平均数初始化,再两两交换 swap(a,b) { value = rand(-a,b); a+=value; b-=value; }
大风哉 2018-01-20
  • 打赏
  • 举报
回复
楼主大家都在替你着急,你前面4个数随机产生,那么第5个数是60减去前面四个数的和,也就是个被动产生的数啊,这样说起来也是随机的吧
--雁南飞-- 2018-01-20
  • 打赏
  • 举报
回复
引用 8 楼 x_xx_xxx_xxxx 的回复:
你的算法本身就不是一定会生成和为 60 的5个随机数。 可以第一个先生成 :a0 = rand() %(60-4) 第二个 : a1 = rand() %(60-3-a0) a2 = rand() %(60-2-a0-a1) a3 = rand() %(60-1-a0-a1-a2) a4 = rand() %(60-a0-a1-a2-a3)
int a0 = rand() %(60-4); int a1 = rand() %(60-3-a0); [b]int a2 = rand() %(60-2-a0-a1); int a3 = rand() %(60-1-a0-a1-a2); int a4 = 60-a0-a1-a2-a3; cout<<"a0:"<<a0<<endl; cout<<"a1:"<<a1<<endl; cout<<"a2:"<<a2<<endl; cout<<"a3:"<<a3<<endl; cout<<"a4:"<<a4<<endl; cout<<"a:"<<a0+a1+a2+a3+a4<<endl; 这样才对
q1055145936 2018-01-19
  • 打赏
  • 举报
回复
// rand.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
# include <stdio.h>
# include <stdlib.h>
# include <time.h>


int main(int argc, char* argv[])
{
	srand( (unsigned int)time(NULL) );
	int max=60;
	int num[4];
	int Rand;
	for(int i=0;i<4;i++)
	{
		Rand = (rand()%max) + 1;
		num[i]=Rand;
		max=max-num[i];
		printf("%d\n",num[i]);
	}
	
	return 0;
}
xiao晨 2018-01-19
  • 打赏
  • 举报
回复
试了一下八楼的方法,越前面的数比较大的概率越大,可以推一下公式,第一个数大于30的概率大于第二个数大于30的概率
xiao晨 2018-01-19
  • 打赏
  • 举报
回复
八楼正解,挺简单的 还有一种思路就是: 1先随机五个数 2按比例算出和为60的时候分别为多少。

//测试用代码
#include <stdio.h>
#include <stdlib.h>
//#include <time.h>


int main()
{
	while (1)
	{
		int a[5], b[5];
		double sum_a = 0;
		int sum_b4 = 0;
		for (int i = 0; i < 5; i++)
		{
			a[i] = rand() % 60;
			sum_a += a[i];
		}
		for (int i = 0; i < 4; i++)
		{
			b[i] = 60 * (a[i] / (sum_a));
			sum_b4 += b[i];
		}
		b[4] = 60 - sum_b4;

		for (int i = 0; i < 5; i++)
		{
			printf("b[%d]=%d\n", i, b[i]);
		}
		printf("\n");
		system("pause");

	}


	return 0;
}

TerryHHl 2018-01-12
  • 打赏
  • 举报
回复
无限生成,, 和不是60就 不停的 生成.. 直到 =60
zilaishuichina 2018-01-12
  • 打赏
  • 举报
回复
先随机出5个数, 求和, 如果和大于60,对每个数字,依次随机减1(就是可能减,可能不减,下标i的元素判断完,就继续处理下标为i+1的元素,下标为4的处理完,继续处理下标为0的), 直到和为60为止 如果和小于60,对每个数字,依次加1, 直到和为60为止
加载更多回复(7)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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