C++ 写了个生成随机数的函数,但调用的时候出了点问题,请问有两个参数的函数怎么声明?

下面是两个函数用来生成随机数
//函数:RandomInit
//该函数取当前系统时间作为随机数发生器的种子
void RandomInit()
{
srand(time(NULL));
}

// 函数:RandomInteger
// 该函数将0到RAND_MAX的区间的划分成high - low + 1 个
// 子区间。当产生的随机数落在第一个子区间时,则映射成low。
// 当落在最后一个子区间时,映射成high。当落在第i个子区间时
//(i从0到high-low),则映射到low + i
int RandomInteger(int low, int high)
{
return (low + (high - low + 1) * rand() / (RAND_MAX + 1));
}

然后我现在想在mian函数里调用它们来生成随机数,我是这样写的:

int main()
{
int in[3],rand[3];
int i,j,k,A,B;

void RandomInit();
int RandomInteger(int,int);
for(i=0;i<=2;i++)
{
in[i]=RandomInteger(0,9);
}
k=0;
while(k<=6)
{
cout<<"请输入你要猜测的数字:"<<endl;
for(i=0;i<=2;i++)cin>>in[i];
A=B=0;
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
if(in[i]==rand[j])
if(i==j)A++;
else B++;
}
}
cout<<A<<"A"<<B<<"B"<<endl;
k++;
}

return 0;
}
但是运行的时候有问题呀,无论输入什么数字都是0A0B,我觉得应该是生成随机数那块出了问题。。
求指导,谢谢!
1、游戏开始,电脑随机生成三个不重复的十以内的数字。
2、玩家输入他所猜测的三个数字
3、将玩家提交的数与电脑生成的数进行比较,结果显示成"*A*B"。A代表位置正确数字也正确,B代表数字正确但位置不正确,比如:"2A0B"表示您有2个数字的位置正确且数值也正确,除此以外,您还猜对了0个数字,但位置不对。
4、玩家共有7次机会,在7次内,如果结果为“3A0B”,游戏成功。如果7次里玩家都没有猜对游戏失败。

两个问题:

    每次取随机数必须先重新初始化,否则取出数据会一样

    参数没有问题,取随机数的返回运算并不好,MAX范围太大而且可能产生溢出,建议改成取余数模式

int RandomInteger(int low, int high)
{
return (low + rand()%(high - low + 1) );
}


for(i=0;i<=2;i++)
{

RandomInit();
in[i]=RandomInteger(0,9);
}

追问

我把初始化的条件加进去了,但运行时还是不对呀,输入任何3个数出来的都是0A0B。。

还有其实我没懂MAX那个语句为什么范围会太大溢出呀?

谢谢!

追答void RandomInit()
{
  srand(time(NULL));
}
int RandomInteger(int low, int high)
{
    return (low + rand()%(high - low + 1));
}
int main()
{
    int in[3],rand[3];
    int i,j,k,A,B;
                                                                 
    void RandomInit();
    int RandomInteger(int,int);
    for(i=0;i<=2;i++)
    {
        RandomInit();
        rand[i]=RandomInteger(0,9);
    }
    k=0;
    while(k<=6)
    {
        cout<<"请输入你要猜测的数字:"<<endl;
        for(i=0;i<=2;i++)cin>>in[i];
        A=B=0;
        for(i=0;i<=2;i++)
        {
            for(j=0;j<=2;j++)
            {
                if(in[i]==rand[j])
                    if(i==j)A++;
                    else B++;
            }
        }
        cout<<A<<"A"<<B<<"B"<<endl;
        k++;
    }
                                                                 
    return 0;
}

你的代码逻辑错误,rand[i]没有赋值,以上代码调试ok

追问

运行是能运行了,但随便输哪三个数出来的都是0A0B呀。。

追答

调试好了给你的好不好。。。

追问

我们两个的代码除了rand[i]=RandomInteger(0,9);这句还有哪里不同呀,我把这句改了但自己的代码还是运行不出来。。
你的代码运行的结果不符合题意诶。
怎么会出现2A4B呢。。。应该不能大于3呀

题目要求还有要生成不重复的3位数,不知道应该怎么实现哦。。

追答

不重复的3个数,你的程序逻辑明显没有实现,随机生成的当然可能重复,如果重复,3A4B也是正常的。

#include<stdlib.h>
#include<time.h>
#include<iostream.h>
void RandomInit()
{
  srand(time(NULL));
}
int RandomInteger(int low, int high)
{
    return (low + rand()%(high - low + 1));
}
int main()
{
    int in[3],rand[3];
    int i,j,k,A,B;
       
    void RandomInit();
    int RandomInteger(int,int);
    for(i=0;i<=2;i++)
    {
        RandomInit();
        rand[i]=RandomInteger(0,9);
        for (j=0;j<i;j++)
        {
            if(rand[i]==rand[j])
            {
                RandomInit();
                rand[i]=RandomInteger(0,9);
                j=-1;//again
            }
        }
    }
    //Delete while end test
    cout<<rand[0]<<" "<<rand[1]<<" "<<rand[2]<<endl;
    k=0;
    while(k<=6)
    {
        cout<<"请输入你要猜测的数字:"<<endl;
        for(i=0;i<=2;i++)cin>>in[i];
        A=B=0;
        for(i=0;i<=2;i++)
        {
            for(j=0;j<=2;j++)
            {
                if(in[i]==rand[j])
                    if(i==j)A++;
                    else B++;
            }
        }
        cout<<A<<"A"<<B<<"B"<<endl;
        if (A==3)
        {
            cout<<"猜对了!游戏完成。"<<endl;
            k +=7;
        }
        else
            k++;
    }
       
    return 0;
}

追问

不好意思,下午出去了!

我看懂你加的那个生成不重复的三位数代码了,但是不知道为什么我把你代码放到codeblock里运行不出来,我觉得应该没问题呀!
还有是不是我们对题目的理解不同,我觉得题目的意思是电脑随机生成三位数,只生成一次,玩家根据每次输入后电脑给出的提示不断猜,7次内猜中这三位数就算赢,所以我觉得不可能出现大于3的数,因为一共才3个数怎么可能猜对4个呢。。。

追答

你猜对4个,就是因为重复罢了,程序逻辑问题。新程序没有这个了,运行了再来说话。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-18
A代表什么,B代表什么

如果A代表猜中次数,B代表失败次数的话
for(j=0;j<=2;j++)
{

if(in[i]==rand[j])
{
if(i==j)
A++;
}else B++;
}
}追问

不好意思,前面没把题目要求讲清楚
我现在把A和B的含义加在问题补充里了

追答#include<iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
void RandomInit()
{
  srand(time(NULL));
}
int RandomInteger(int low, int high)
{
    return (low + rand()%(high - low + 1));
}
int main()
{
    int in[3],rand[3];
    int i,j,k,A,B;
                                                                           
    void RandomInit();
    int RandomInteger(int,int);
    RandomInit();//放在循环外
    for(i=0;i<=2;i++)
    {
                  
        rand[i]=RandomInteger(0,9);
    }
    k=0;
    while(k<=6)
    {
        cout<<"请输入你要猜测的数字:"<<endl;
        for(i=0;i<=2;i++)cin>>in[i];
        A=B=0;
        for(i=0;i<=2;i++)
        {
            for(j=0;j<=2;j++)
            {
                if(in[i]==rand[j])
                    if(i==j)A++;
                    else B++;
            }
        }
        cout<<A<<"A"<<B<<"B"<<endl;
        k++;
    }
                                                                           
    return 0;
}

第2个回答  2013-05-18
生成某个范围内随机数应该是:low+rand()%(high-low+1)
RAND_MAX 是代表随机数的最大值,你rand如果产生小于它的值的话,两个整数除就是0了。

C++生成随机数rand\/srand函数
C++中生成随机数的核心在于rand()和srand()函数。在C++11之前,这两个函数已经能满足基本需求,但新版本提供了更多选择。rand()返回一个0到RAND_MAX之间的整数,尽管看似随机,其实是由种子决定的,且默认种子为1,导致每次运行结果固定。为获得不同序列,srand()用于设置rand()的种子,常用time函数作为...

c++中生成随机数时的种子问题
先纠正一下错误,是srand((unsigned int)time(0));srand的形参是unsigned int类型的;这句话只要写一次,一般情况下只能写一次;随机数是随机的数,但计算机不可能产生随机数,计算机根据你的输入,再跟一个算法就产生一个特定的序列.只要你给计算机一个相同的数,计算机返回的就是一个特定的数,所以这样...

C++产生随机数的
\\x0d\\x0a\\x0d\\x0aC++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同...

c++ 怎么从给定的数中随机取两个不同的数
那么先调用srand函数生成随机种子,然后使用Rand()生成随机数。Rand()\/N将产生0-(N-1)之间的数,或者除以N+1产生0到N。然后根据产生的两个随即下标去寻找数。

Flipc\/c++中的flip函数
我们使用rand()函数生成随机数,然后根据结果更新正面计数器(front)或反面计数器(back)。最后,程序会输出每轮的结果以及正面和反面的总次数。以下是参考代码:include include int flip() { return rand() % 2;} int main() { int i, front = 0, back = 0, r;for (i = 0; i < 100;...

为啥我的c++产生随机数的函数不起作用呢?
那是当然啦。你用的是时间做随机数种子,也就是说在1s中之内,你调用了多次生成随机数的函数。而这个随机数是伪随机的,也就是可以重复得到的。而你的随机数种子没变,所以就得到差不多大小的咯。只要你把srand(time(NULL));这句注释掉,你就会看到生成的不是差不多一样的了。追问:但是这些数是...

Visual C++ sprintf()函数用法
sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访 问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通 常用眼睛再把出错的代码多看几眼就看出来了。sprintf 将字串格式化。在头文件 #includestdio.h中语法: int sprintf(string format, ...

我有一段C++函数,是关于生成随机数的,如何更改它输出值的小数点位置,要...
} 试试。需要注意的问题:第一:用setiosflags 和 setprecision 两个函数之前必须 #include<iomanip> 第二:楼主的display函数里面重复定义 itList ,输出X的时候 定义了一次,输入Y的时候也定义了一次,编译没通过。这些改过来之后,运行成功。最后提醒楼主,不要把代码写在类的定义里面. 不直观。

怎么用C++编写一个rand()函数,功能上是产生10个0-100之间的随机整数
电脑、C语言编译器。1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。2、在test.cpp文件中,输入C语言代码:for (int i = 0; i < 10; i++)printf("%d ", rand() % 100 +1);3、编译器运行test.cpp文件,此时成功通过rand产生了10个1-100内的整数。

我编了一个小程序,里面设置随机数种子的函数报错?
srand 是库函数 放 主函数 或者 某个 函数里就行 如 main 里 不能放函数外面!!!除非是不用酷暑,自定义的函数!声明自定义函数

相似回答