我正在开展一个大型项目,但在这里我只是坚持了这个项目的一小部分。目标是以40%的几率使事情发生,所以我制作了一个包含4" 1"和6" 0",如果它是" 1"然后它会发生但是我的条件不起作用,它总是打印" abcd"即使它是randoms" 0"。这里有愚蠢的错误吗? 第二个对应部分是每3秒发生一次
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include "vtscreen.h"
int main(void){
int x, y, i=0;
int random1, random2, min;
int array[10] = {1,1,1,1,0,0,0,0,0,0};
srand(time(NULL));
//ClearScreen();
time_t start, end;
int elapsed;
time(&start); /* start the timer */
do {
time(&end);
elapsed = difftime(end, start);
//gotoxy(1, 15);
printf("Time elapsed: %.1d\n", elapsed);
if(elapsed == 0) continue;
min = elapsed%3;
if(min == 0){
random1 = array[rand() % 10];
printf("%d\n", random1);
if(random1 == 1){
printf("abcd");
}
}
}
while (1);
}
这是我被困的条件部分
printf("%d\n", random1);
if(random1 == 1){
printf("abcd");
}
更新: 所以我只是试着把条件设为&#34; random1 == 2&#34;并且它不起作用,似乎当随机的运行时,即使结果是&#34; 0&#34;,如果它通过&#34; 1&#34;条件仍然有效。反正是否有随机数或任何解决方案的条件有40%的可能性?
答案 0 :(得分:3)
您的计时逻辑将在几秒钟内对骰子滚动进行多次评估,可以被3整除。这些卷中的一些将满足您的条件并且您的文本将被打印。因为在不满足条件时不打印任何因为您总是打印到同一屏幕位置,所以您没有注意到。
快速解决方法是在掷骰子后重置start
计时器。下面的程序说明了这一点。 (它还将骰子滚动与时序逻辑分开。)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void roll(void)
{
int r = rand() % 10;
if (r < 4) {
printf("%d Hit!\n", r);
} else {
printf("%d Miss.\n", r);
}
}
int main(void)
{
time_t start = time(NULL);
srand(start);
while (1) {
time_t now = time(NULL);
if (difftime(now, start) >= 3) {
start = time(NULL);
roll();
}
}
return 0;
}
这是做定时事件的一种非常粗糙的方式。如果您正在使用事件驱动的框架,例如GUI工具包,用户所做的一切,点击mpouse,按键等等都是一个事件,您可以使用定时事件来设置超时或者在您的情况下以特定间隔发生的事件。这样的解决方案可能更好,但取决于平台。
答案 1 :(得分:2)
试试这个:
do {
time(&end);
elapsed = difftime(end, start);
gotoxy(1, 15);
printf("Time elapsed: %.1d\n", elapsed);
if(elapsed == 0) continue;
min = elapsed%3;
if(min == 0){
random1 = array[rand() % 9];
printf("%d\n", random1);
time(&start);
if(random1 == 1){
printf("abcd");
}
}
}
它将重新初始化计时器,你将在每3秒后达到你的状态。
答案 2 :(得分:0)
你可以看到这篇文章:http://www.geeksforgeeks.org/random-number-generator-in-arbitrary-probability-distribution-fashion/
在随机数中,你可以保持0和1的概率为4和6。
我认为你可以调整程序以适应你的情况。