| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 702 人关注过本帖, 1 人收藏
标题:c++研发笔试题目!求好的解法
只看楼主 加入收藏
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:6 
c++研发笔试题目!求好的解法
在游戏中,角色有5个属性分别是A、B、C、D、E  使这5个属性随机的变化,并且每个属性值保持在10~35之间,总和为100不变!要求效率尽可能的高!给出算法来!有没有哪位仁兄知道好的方法的?
搜索更多相关主题的帖子: 研发 
2012-10-17 10:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
首先要简化问题
“角色有5个属性分别是A、B、C、D、E  使这5个属性随机的变化,并且每个属性值保持在10~35之间,总和为100不变!”
简化为
“角色有5个属性分别是A、B、C、D、E  使这5个属性随机的变化,并且每个属性值保持在0~25之间,总和为50不变!”,然后各属性再加10
你先想想为什么要这么做,这才是关键

程序代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

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

    int sum = 50;
    for( int i=0; i<4; ++i )
    {
        int v = ( sum!=0 ? rand()%min(26,sum) : 0 ) + 10;
        sum -= v-10;
        cout << char('A'+i) << " = " << v << endl;
    }
    int E = sum + 10;
    cout << "E = " << E << endl;

    return 0;
}

2012-10-17 10:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
我仔细想了下,这样做的话
A,B得高属性的几率 大于 C 大于 D和E
我再想想
2012-10-17 11:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:15 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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

    int V[5] = { rand()%26, rand()%26, rand()%26, rand()%26, rand()%26 }; // 可以优化成只要调要两次rand(),但不想麻烦了
    int S = V[0] + V[1] + V[2] + V[3] + V[4];
    if( S == 0 )
    {
        V[0] = V[1] = V[2] = V[3] = V[4] = 20;
    }
    else
    {
        // 将各项等比率扩张或缩小,使之等于100
        V[0] = V[0] * 50/S + 10;
        V[1] = V[1] * 50/S + 10;
        V[2] = V[2] * 50/S + 10;
        V[3] = V[3] * 50/S + 10;
        V[4] = V[4] * 50/S + 10;
        // 但有可能总和还是不等于100,因此将剩余的几个数随机分掉
        S = 100 - (V[0] + V[1] + V[2] + V[3] + V[4]);
        if( S != 0 )
        {
            int r = rand(); // 因为S一定是大于0小于5的,5*5*5*5<RAND_MAX,所以一个rand()就够了
            for( int i=0; i<S; ++i )
            {
                ++V[r%5];
                r /= 5;
            }
        }
    }

    printf( "A = %d\n", V[0] );
    printf( "B = %d\n", V[1] );
    printf( "C = %d\n", V[2] );
    printf( "D = %d\n", V[3] );
    printf( "E = %d\n", V[4] );

    return 0;
}
2012-10-17 14:54
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:5 
感觉为了不影响每个数的概率,机选0到25之间5个数后,应尽可能同时加减某个数,使之和为100,(超界的不作处理),不知行?

www.qunxingw.wang
2012-10-17 14:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
以下是引用qunxingw在2012-10-17 14:59:11的发言:

感觉为了不影响每个数的概率,机选0到25之间5个数后,应尽可能同时加减某个数,使之和为100,(超界的不作处理),不知行?

我在四楼的算法和你差不多,我是根据各自获得的随机值按比率缩放,你是加减一个固定数。
但加减一个固定数的话,就会出现超界的情况(即小于10或大于35),只能“劫富济贫”了,这样就使得五项属性值的差异略微减小了。
2012-10-17 15:29
lchpersonal
Rank: 2
等 级:论坛游民
威 望:1
帖 子:34
专家分:81
注 册:2012-7-27
收藏
得分:0 
回复 4楼 rjsp
方法很不错,谢谢

重剑无锋,大巧不工
2012-10-19 10:42
快速回复:c++研发笔试题目!求好的解法
数据加载中...
 
   



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

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