| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6588 人关注过本帖
标题:求帮助,随机产生和为 100 的 10 个 0-30 的随机数,和为 100 不会怎么实现 ...
只看楼主 加入收藏
我是水压哈
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-11-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
求帮助,随机产生和为 100 的 10 个 0-30 的随机数,和为 100 不会怎么实现,
求帮助,随机产生和为100的10个0-30的随机数,和为100不会怎么实现,
2014-11-20 13:44
playyang123
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:70
专家分:332
注 册:2014-11-17
收藏
得分:4 
随机数会写吗? 你生成的随机数在定义一个数组   然后把数组求和  random()
2014-11-20 14:37
我是水压哈
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-11-20
收藏
得分:0 
回复 2 楼 playyang123
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{int a[10];
 int i;
srand((unsigned)time(0));
for(i=0;i<10;i++)
  {a[i]=rand()%30;
  printf("%d\n",a[i]);
  }
    system("pause");
    return 0;
}
这是随机产生10个0-30的数,可是不太明白你说的怎么实现,可以给我举个例子写一下程序吗?谢谢了~
2014-11-20 15:38
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
收藏
得分:4 
回复 楼主 我是水压哈
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int 
main()
{
    int a[10] ;
    int i, temp ;
    int sum = 100 ;        //和初始化为100
    srand ( (unsigned)time(0) );
    /*
    **因为和固定为100,所以只需要随机生成9个数,100减9个数之和就是第十个数
    */
    for ( i = 0; i < 9; i++) {
        temp = rand() % 31 ;
        /*
        **每生成一个数temp,就用sum-temp检查生成的数字之和是否超过了100
        */
        if ( sum - temp >= 0 ) {
            a[i] = temp ;
            sum -= temp ;
        }
        else {
            i-- ;
        }
    }
    a[9] = sum ;
    for ( i = 0; i < 10; i++ ) {
        printf("%02d  ",a[i]);
    }
    printf ( "\n" ) ;
    system("pause");
    return 0;
}

[qq]949654600[/qq]
2014-11-21 18:14
想念遇见
Rank: 2
等 级:论坛游民
帖 子:87
专家分:74
注 册:2012-5-10
收藏
得分:4 
看来我理解错了

[ 本帖最后由 想念遇见 于 2014-11-21 19:54 编辑 ]
2014-11-21 19:38
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:4 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int a[10];
int i, j, k, sum = 0;

void print(int *b);

int main(void)
{
    srand((unsigned int)time(NULL));

  L:for (i = 0; i < 10; i++)
    {
        a[i] = 1 + (int)(30.0 * rand() / (RAND_MAX + 1.0));

        do
        {
            i++;
            a[i] = 1 + (int)(30.0 * rand() / (RAND_MAX + 1.0));
            for (j = 0; j < i;)
            {
                if (a[i] != a[j])
                {
                    j++;
                }
                else
                {
                    a[i] = 1 + (int)(30.0 * rand() / (RAND_MAX + 1.0));
                    i--;
                    continue;
                }
            }
            //printf("%d %d\n", a[i-1], a[i]);
        } while (i < 9);

        for (k = 0; k < 10; k++)
        {
            sum += a[k];
        }

        if (sum != 100)
        {
            sum = 0;
            goto L;
        }
    }
    print(a);
    printf("\n");

    return 0;
}

void print(int *b)
{
    int t, x, y;
    for (x = 0; x < 10; x++)
    {
        for (y = 0; y < (9 - x); y++)
        {
            if (b[y] > b[y + 1])
            {
                t = b[y];
                b[y] = b[y + 1];
                b[y + 1] = t;
            }
        }
    }
    for (x = 0; x < 10; x++)
    {
        printf("%02d  ", b[x]);
    }
}

Only the Code Tells the Truth             K.I.S.S
2014-11-23 17:22
luort
Rank: 1
等 级:新手上路
帖 子:2
专家分:4
注 册:2014-11-24
收藏
得分:4 
为了效率保证每次都能生成一组数是100的。
1、先随机生成3个数(这三个数加起来肯定到不了100),3个数相加起来,得到n,M=100-n
    判断M是否大于30,如果大于,则在随机出一个数,现在得到4个数(这4个数显然小于100),这4个数相加起来,得到n,M=100-n
    如果M小于30,比如,25,则第四个数就,0到25随机出来一个
    如次继续。。。。
    当然最后一个数就是100减掉之前的了。
2、这样的好处就是每次随机生成的数你都可以用上了。而且,会在可预料的循环次数里,生成这十个数。如果仅仅是先随机,在判断,结果就是运气不好的话,程序要跑好久,才能出现结果。
2014-11-24 15:57
luort
Rank: 1
等 级:新手上路
帖 子:2
专家分:4
注 册:2014-11-24
收藏
得分:0 
回复 7 楼 luort
但是不管是楼上的方案或者是我的方案,都没有做到真正的随机。仅仅是每次看起来不一样而已。因为每次出一个数据,都对后面的数据存在影响。限制了后面的随机。


要做到更好的随机,可以用一次撒种子的手段:
手上拿着100个豆子,
有十个坑,每个坑最多只能装30个豆子,豆子只能进坑里。
吧唧,将100个豆子撒出去,随意进坑。一个动作,谁也不管谁,互不干扰,全凭天意!!!

关于随机,我只知道真正的随机是薛定谔的猫,这是上帝的旨意。
2014-11-24 16:36
快速回复:求帮助,随机产生和为 100 的 10 个 0-30 的随机数,和为 100 不会怎么 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024980 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved