| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1233 人关注过本帖
标题:这道题目纠结我好久。请求帮助。。
只看楼主 加入收藏
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:10 
这道题目纠结我好久。请求帮助。。

【编程题】(满分23分)

    俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。

    有一种赌局是这样的:桌子上放六个匣子,编号是1至6。多位参与者(以下称玩家)可以把任意数量的钱押在某个编号的匣子上。所有玩家都下注后,庄家同时掷出3个骰子(骰子上的数字都是1至6)。输赢规则如下:

    1. 若某一个骰子上的数字与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目赔付(即1比1的赔率)。

    2. 若有两个骰子上的数字与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目的2倍赔付(即1比2的赔率)。

    3. 若三个骰子上的数字都与玩家所押注的匣子号相同,则玩家拿回自己的押注,庄家按他押注的数目的6倍赔付(即1比6的赔率)。

    4. 若玩家所押注匣子号与某个骰子示数乘积等于另外两个骰子示数的乘积,则玩家拿回自己的押注,庄家也不赔付(流局)。

    5. 若以上规则有同时满足者,玩家可以选择对自己最有利的规则。规则执行后,则庄家收获所有匣子上剩余的押注。

    乍一看起来,好像规则对玩家有利,庄家吃亏。但经过大量实战,会发现局面很难说,于是怀疑是否庄家做了手脚,庄家则十分爽快地说:可以由玩家提供骰子,甚至也可以由玩家来投掷骰子。

    你的任务是:通过编程模拟该过程。模拟50万次,假定只有1个玩家,他每次的押注都是1元钱,其押注的匣子号是随机的。再假定庄家有足够的资金用于赔付。最后计算出庄家的盈率(庄家盈利金额/押注总金额)。
【输入、输出格式要求】

    程序无输入,程序运行输出庄家的盈率,四舍五入保留到小数后3位。
【注意】

    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
   
    在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。

    请把所有函数写在同一个文件中,调试好后,拷贝到【考生文件夹】下对应题号的“解答.txt”中即可。
   
    相关的工程文件不要拷入。
   
    源代码中不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
   
    允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。

    例如,不能使用CString类型(属于MFC类库),不能使用randomize, random函数(不属于ANSI C++标准)
题目不允许使用srand(),rand()函数、
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 6
int profit = 0;
int jiazi;
int A_dice;
int B_dice;
int C_dice;
void renshaizi(double n)
{
    int falg = 0;
    int digit = 0;
    int i = 0;
    srand(time(NULL));
    while(i<n)
    {
        falg = 0;
        digit = 0;
        jiazi = 1 + rand()%M;
        A_dice = 1 + rand()%M;
        B_dice = 1 + rand()%M;
        C_dice = 1 + rand()%M;
        if(jiazi == A_dice || jiazi == B_dice || jiazi == C_dice)
        {
            profit--;
            falg ++;
            if((jiazi == A_dice &&jiazi == B_dice)||(jiazi == B_dice &&jiazi == C_dice)||(jiazi == A_dice && jiazi == C_dice))
            {
                profit--;
                falg++;
                if(jiazi == A_dice && jiazi == B_dice && jiazi == C_dice)
                {
                    profit = profit - 4;
                    falg = falg + 4;
                }
            }
        }
        if((jiazi * A_dice == B_dice * C_dice) || (jiazi * B_dice == A_dice * C_dice) ||(jiazi * C_dice == B_dice * A_dice))
        {
            digit = 1;
            if(falg +digit!=7)
            {
                profit = profit + falg;
            }
        }
        if(falg == 0)
        {
            profit++;
        }
        i++;
    }
}
int main(void)
{
    double n;
    double sum = 0.0;
    scanf("%lf",&n);
    renshaizi(n);
    sum = n/profit;
    printf("%.3f",sum);
    puts("");
    return 0;
}

这是我使用srand()与rand()函数写出来的不知道对不对。
望路过的人帮忙看下。 如果哪位懂不用srand(),rand()函数的人请您给一些思维。让小弟顺利升完这一级。
搜索更多相关主题的帖子: 玩家 
2013-04-23 16:31
梅可伟梅可伟
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:180
注 册:2013-3-11
收藏
得分:0 
#include<stdio.h>//这是你的,我改了一下,你看行不行
#include<stdlib.h>
#include<time.h>
#define M 6
int profit = 0;
int jiazi;
int A_dice;
int B_dice;
int C_dice;
void renshaizi(double n)
{
     int falg = 0;
     int digit = 0;
     int i = 0;
     srand(time(NULL));
     while(i<n)
     {
         falg = 0;
         digit = 0;
         jiazi = 1 + rand()%M;
         A_dice = 1 + rand()%M;
         B_dice = 1 + rand()%M;
         C_dice = 1 + rand()%M;
         if(jiazi == A_dice || jiazi == B_dice || jiazi == C_dice)
         {
             profit--;//庄家输1元
             falg ++;//胜一元
             if((jiazi == A_dice &&jiazi == B_dice)||(jiazi == B_dice &&jiazi == C_dice)||(jiazi == A_dice && jiazi == C_dice))
             {
                 profit--;//庄家输2元
                 falg++;//胜2元
                 if(jiazi == A_dice && jiazi == B_dice && jiazi == C_dice)
                 {
                     profit = profit - 4;//庄家输6元
                     falg = falg + 4;//胜4元
                 }
             }
         }
         /*else if((jiazi * A_dice == B_dice * C_dice) || (jiazi * B_dice == A_dice * C_dice) ||(jiazi * C_dice == B_dice * A_dice))
         {
             /*digit = 1;
             if(falg +digit!=7)
             {
                 profit = profit + falg;
             }
         }*/
         if(falg == 0)//如果玩家不满足上面的条件则庄家胜一元
         {
             profit++;//庄家胜一元
         }
         i++;
     }
}
int main(void)
{
     double n;
     double sum = 0.0;
     scanf("%lf",&n);
     renshaizi(n);
     sum = profit/n;//这里应该是profit/n
     {sum=sum*10*10*10*10;
     if(int(sum)%10>4) sum=(int)sum+10-(int)sum%10;
     sum=sum/(10*10*10*10);}//sum还要保留3们小数
     printf("%.3f",sum);
     puts("");
     return 0;
 }
 
2013-04-23 20:22
梅可伟梅可伟
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:180
注 册:2013-3-11
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 500000
void main()
{
    float x;
    int m,n=0,a1,a2,a3,i;
    srand(time(NULL));
    for(i=0;i<50*10000;i++)
    {
        a1=rand()%10+1;
        a2=rand()%10+1;
        a3=rand()%10+1;
        m=rand()%6+1;
        if(m==a1&&m==a2&&m==a3) n=n-6;//庄家输1
        else if(m==a1&&m==a2||m==a1&&m==a3||m==a2&&m==a3) n=n-2;//庄家输2
        else if(m==a1||m==a2||m==a3) n=n-1;//庄家输6
        else if(m*a1==a2*a3||m*a2==a1*a3||m*a3==a1*a2);//不输不胜
        else n=n+1;//庄家胜1
    }
    x=float(n)/N;
    printf("%.3f\n",x);
}

2013-04-23 21:22
梅可伟梅可伟
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:180
注 册:2013-3-11
收藏
得分:10 
#include <stdio.h>//不好意思刚才贴错了
#include <stdlib.h>
#include <time.h>
#define N 500000
void main()
{
    float x;
    int m,n=0,a1,a2,a3,i;
    srand(time(NULL));
    for(i=0;i<50*10000;i++)
    {
        a1=rand()%6+1;
        a2=rand()%6+1;
        a3=rand()%6+1;
        m=rand()%6+1;
        if(m==a1&&m==a2&&m==a3) n=n-6;//庄家输1
        else if(m==a1&&m==a2||m==a1&&m==a3||m==a2&&m==a3) n=n-2;//庄家输2
        else if(m==a1||m==a2||m==a3) n=n-1;//庄家输6
        else if(m*a1==a2*a3||m*a2==a1*a3||m*a3==a1*a2);//不输不胜
        else n=n+1;//庄家胜1
    }
    x=float(n)/N;
    printf("%.3f\n",x);
}
2013-04-23 21:23
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
收藏
得分:0 
回复 4楼 梅可伟梅可伟
您的第一种错的吗? 我后面那句if是用来满足条件4的。。
您会不会不适用rand()函数呀。 - -。 我为了这么迷乱了很久。

一同学习, 一同进步
2013-04-23 22:37
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
不是用rand函数,还要随机,应该是要自己写了,time相关应该可以体现随机性了


[fly]存在即是合理[/fly]
2013-04-23 22:59
梅可伟梅可伟
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:180
注 册:2013-3-11
收藏
得分:0 
回复dengluoy
我最后一种是对的,前面都有点小问题,而你的控制条件有问题
我的第二种6打成了10;而你的错误主要有两点:一 是控制条件,1)庄家可能输一元,2)庄家可能输2元,3)庄家可能输6元,4)庄家可能不胜不输,5)庄家可能胜一元
而你的第4)种(庄家不输不赢)没有达到目的;
二是: 应该庄家赢的钱/玩家的本金;你这里写反了;
至于srand(NULL(time))是产生一批数据,种子,而rand()是从这批数据中随机的抽取一个,而rand%6+1是为了保证这个数的值范围为1-6;达到模拟这6个点的作用
2013-04-24 17:59
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
呵呵   反正是概率问题,就选定一个数字(比如说:5)押50万次,结果也是一样的,不必纠结

三十年河东,三十年河西,莫欺少年穷!
2013-04-24 20:22
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
收藏
得分:0 
回复 6楼 azzbcc
time 库,? 还是自己来写一个模仿srand()和rand()函数,?

一同学习, 一同进步
2013-04-24 20:39
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
收藏
得分:0 
回复 4楼 梅可伟梅可伟
我之所以用了一个计数器就是因为条件5.
如果同时满足前4条: 玩家可以选择对自己最有利的规则。(玩家肯定拿6倍的) 然后只有一个玩家,所有夹子上不留任何钱。
等于(如果同时满足以上4条。玩家就得6倍奖励)
不知道我这样理解题意对不对。

一同学习, 一同进步
2013-04-24 20:52
快速回复:这道题目纠结我好久。请求帮助。。
数据加载中...
 
   



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

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