在我的代码中,C模运算符与随机生成的整数表现异常

在我的代码中,C模运算符与随机生成的整数表现异常,c,random,C,Random,在我下面的代码中,对两个随机生成的数字使用模运算,但输出常常不正确。为什么会这样 以下是意外输出的示例: #包括 #包括 #包括 #包括 #包括 无效延迟(整数秒) { //将时间转换为毫秒 整数毫秒=1000*秒数; //存储开始时间 时钟开始时间=时钟(); //循环直到未达到所需时间 同时(时钟()

在我下面的代码中,对两个随机生成的数字使用模运算,但输出常常不正确。为什么会这样

以下是意外输出的示例:

#包括
#包括
#包括
#包括
#包括
无效延迟(整数秒)
{
//将时间转换为毫秒
整数毫秒=1000*秒数;
//存储开始时间
时钟开始时间=时钟();
//循环直到未达到所需时间
同时(时钟()<开始时间+毫秒)
;
}
void ran_dom(){//此函数生成一个随机数并打印其余数
srand(时间(0));
int x=(int)rand();
int y=(int)rand();
printf(“x:%d\n”,x);
printf(“y:%d\n”,y);
int mod_x=(x%40);//值为40的模运算符
int mod_y=(y%20);//值为20的模运算符
printf(“x mod 40:%d\n”,mod_x);
printf(“y模块20:%d\n”,模块y);
}
void ResetScreenPosition(){//重置屏幕位置(在windows操作系统中)
协调地位;
处理hOut;
hOut=GetStdHandle(标准输出句柄);
位置X=0;
位置Y=0;
设置控制台位置(小时、位置);
}
void main(){
而(1){
重置屏幕位置();
ran_dom();
延迟(2);
}
}

谢谢你看

6327%40
7
。如果屏幕上有23个字符位于上一次打印的7的位置,则打印
“x mod 40:7”
将显示打印了
“x mod 40:73”

尝试以下备选方案之一:

printf("x mod 40: %02d \n", mod_x);
printf("[x mod 40: %d]\n", mod_x);

我刚刚发现,在从主函数调用delay()之后放置这段代码也很有效:

system("cls"); // refreshes screen? works!

据我所知,在c语言中没有标准的清除屏幕的方法。 输出中的错误来自未清除屏幕而覆盖屏幕

unistd.h中还有一个sleep(int seconds)函数。使用它可能比循环更好

调用srand()一次就足够了。您不需要设置每次调用的随机种子

这可能是我的实现:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

void clear_screen() {
#ifdef WINDOWS
    system("cls");
#else
    /* Assume POSIX */
    system ("clear");
#endif
}

void print_random() {
    int x, y, mod_x, mod_y;

    x = rand();
    y = rand();
    printf("x: %d\n", x);
    printf("y: %d\n", y);

    mod_x = (x % 40);
    mod_y = (y % 20);
    printf("x mod 40: %d\n", mod_x);
    printf("y mod 20: %d\n", mod_y);
}

int main() {
    srand(time(NULL));
    while(1) {
        clear_screen();
        print_random();
        sleep(2);
    }
    return 0;
}
#包括
#包括
#包括
#包括
无效清除屏幕(){
#ifdef窗口
系统(“cls”);
#否则
/*假设POSIX*/
系统(“清除”);
#恩迪夫
}
无效打印_random(){
int x,y,mod_x,mod_y;
x=兰德();
y=rand();
printf(“x:%d\n”,x);
printf(“y:%d\n”,y);
mod_x=(x%40);
mod_y=(y%20);
printf(“x mod 40:%d\n”,mod_x);
printf(“y模块20:%d\n”,模块y);
}
int main(){
srand(时间(空));
而(1){
清除屏幕();
print_random();
睡眠(2);
}
返回0;
}

因为我手头没有Windows机器,所以我只能在我的Ubuntu上测试这段代码。不过应该可以用。

打电话给
srand
在你的代码中只打一次。至于你的问题。。我会怀疑这种展示。摆脱此
ResetScreenPosition
call@underscore_d可能以前打印的剩余内容
6327%40
7
。如果屏幕上有23个字符位于上一次打印的7的位置,则打印
“x mod 40:7”
将显示打印了
“x mod 40:73”
。试试printf(“[x模块40:%d]\n”,模块x)我不认为由于再现性,这个问题一定是离题的。奇怪的运行时行为是这里的问题,我认为它被正确地推测为与屏幕如何(或是否)被清除有关。虽然我同意答案,但我不一定同意其他选择。似乎打印空白并执行回车操作就能解决问题。最后一种选择可能就足够了。@pmg感谢您的建议。问题是,这段代码只是大型程序的一小部分。我必须将模运算的输出传递给另一个函数,在那里它将被进一步处理。你认为问题在于缓冲区和打印中的剩余物,而不是模运算符本身的结果吗?@MusaKhan你可以通过尝试建议的解决方案轻松回答这个问题……是的,@MusaKhan。我百分之百确定问题不在模数计算上。@pmg我确实尝试过你的建议,它们很有效。但正如我所说,我脑子里有一个比这段代码更大的问题要解决。我只是试着放置一个“系统(“cls”);”在while循环中,每次都可以清除输出屏幕,这也很有效。但输出屏幕会刷新,并显示在我的较大程序中,这是不可取的。