鱼C论坛

 找回密码
 立即注册
查看: 1498|回复: 13

[已解决]随机取六个球问题,代码有一点点小问题

[复制链接]
发表于 2023-4-12 18:09:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

int main() {
               
    srand((unsigned int)time(NULL));                                //随机取六个球问题            
                                                                                    //有重复取数,想问一下友友怎么解决
    int arr[6] = {0};
    int value = 0;//接受随机数
    int flag=0;//arr里有几个球
    int j;
  
    for(int i=0;i<6;i++){//取六个随机数
            value = rand()%32 + 1;
               
            for( j=0;j<flag;j++){//小球数如果拿出过,则重新取数
                if(value==arr[flag]){
                        i--;
                        break;
                    }       
             }
        arr[flag]=value;//否则计数
            flag++;
}
       
         for(int i=0;i<6;i++){
             printf("%d ",arr[i]);
     }
        return 0;

}
最佳答案
2023-4-12 18:15:09
你的代码有一个小错误,你应该在循环内部检查value是否等于arr[j],而不是arr[flag]。以下是修复后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {

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

    int arr[6] = {0};
    int value = 0;
    int flag = 0;
    int j;

    for (int i = 0; i < 6; i++) {
        value = rand() % 32 + 1;

        for (j = 0; j < flag; j++) {
            if (value == arr[j]) {
                i--;
                break;
            }
        }

        if (j == flag) { // 如果没有重复的值,将值添加到数组中
            arr[flag] = value;
            flag++;
        }
    }

    for (int i = 0; i < 6; i++) {
        printf("%d ", arr[i]);
    }

    return 0;

}

现在这段代码应该可以正确地生成六个不同的随机数并将它们存储在数组arr中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 18:15:09 | 显示全部楼层    本楼为最佳答案   
你的代码有一个小错误,你应该在循环内部检查value是否等于arr[j],而不是arr[flag]。以下是修复后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {

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

    int arr[6] = {0};
    int value = 0;
    int flag = 0;
    int j;

    for (int i = 0; i < 6; i++) {
        value = rand() % 32 + 1;

        for (j = 0; j < flag; j++) {
            if (value == arr[j]) {
                i--;
                break;
            }
        }

        if (j == flag) { // 如果没有重复的值,将值添加到数组中
            arr[flag] = value;
            flag++;
        }
    }

    for (int i = 0; i < 6; i++) {
        printf("%d ", arr[i]);
    }

    return 0;

}

现在这段代码应该可以正确地生成六个不同的随机数并将它们存储在数组arr中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:21:46 | 显示全部楼层
本帖最后由 wuliangtdi 于 2023-4-12 18:23 编辑

如果你需要生成不重复的小球编号,你可以使用一个布尔数组来标记数字是否已经被选中。首先将布尔数组所有元素初始化为false。每次生成一个随机数时,检查它是否已经被选中,如果没有,则将对应的布尔数组元素设置为true,并将该随机数添加到数组中。如果该随机数已经被选中,则不添加到数组中,并生成下一个随机数。

下面是一个示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand((unsigned int)time(NULL));
    int arr[6] = { 0 };
    int value = 0;
    int flag = 0;
    bool used[33] = { false }; // 初始化所有数字为未使用状态

    while (flag < 6) { // 只有当选出了6个数字后才退出循环
        value = rand() % 32 + 1;
        if (!used[value]) { // 如果数字没有被使用,则添加到数组中
            used[value] = true;
            arr[flag] = value;
            flag++;
        }
    }
    for (int i = 0; i < 6; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}
这个代码使用了一个布尔数组来标记数字是否已经被使用。如果某个数字被使用了,那么对应的布尔数组元素将被设置为true。在生成随机数时,程序将检查该数字是否已经被使用,如果已经被使用,程序将继续生成下一个随机数,直到找到一个没有被使用过的数字。这样,程序将保证每个数字只会被选中一次。

                               
登录/注册后可看大图

来自ChatGPT
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-12 18:22:41 | 显示全部楼层
isdkz 发表于 2023-4-12 18:15
你的代码有一个小错误,你应该在循环内部检查value是否等于arr[j],而不是arr[flag]。以下是修复后的代码: ...

你这不行,没有图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:25:24 | 显示全部楼层
wuliangtdi 发表于 2023-4-12 18:22
你这不行,没有图片

你这图片是你自己运行的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:27:33 | 显示全部楼层
isdkz 发表于 2023-4-12 18:25
你这图片是你自己运行的吧


是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:31:36 | 显示全部楼层

截图会暴露你的操作系统版本。比如你的系统被我识别为
WIN11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:40:34 | 显示全部楼层
歌者文明清理员 发表于 2023-4-12 18:31
截图会暴露你的操作系统版本。比如你的系统被我识别为
WIN11

无所谓,操作系统罢了,大部分的人现在不都是win10和win11嘛。这个倒还好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:42:33 | 显示全部楼层
wuliangtdi 发表于 2023-4-12 18:40
无所谓,操作系统罢了,大部分的人现在不都是win10和win11嘛。这个倒还好

我打算降级 win7…从win11一路降级,目前装了个虚拟机体验了下,非常好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:47:19 | 显示全部楼层
歌者文明清理员 发表于 2023-4-12 18:42
我打算降级 win7…从win11一路降级,目前装了个虚拟机体验了下,非常好

win 7有些软件不支持了,Py版本高点的只支持win10以上的了,chrome和edge现在也不再对win7提供支持了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:48:34 | 显示全部楼层
wuliangtdi 发表于 2023-4-12 18:47
win 7有些软件不支持了,Py版本高点的只支持win10以上的了,chrome和edge现在也不再对win7提供支持了。

都与 Microhard 公司有那么亿点点关系

因为win8、10、11都会自动检查更新,suo&#8198;yi&#8198;da&#8198;suan&#8198;jiang&#8198;ji
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 18:51:38 | 显示全部楼层
本帖最后由 wuliangtdi 于 2023-4-12 19:00 编辑
歌者文明清理员 发表于 2023-4-12 18:48
都与 Microhard 公司有那么亿点点关系

因为win8、10、11都会自动检查更新,suo&#8198;yi&#8198;da&#81 ...


现在win10也不错了。我是没咋感受会自动更新。反正也有工具可以停止自动更新的(比如Lenovo Quick Fix)

                               
登录/注册后可看大图


Lenovo Quick Fix要钱了,傻逼联想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 21:28:17 | 显示全部楼层
给一个洗牌的方式
#include <iostream>
#include<time.h>
using namespace std;
int main()
{
    int ball[33],i,j,t;
    for(i=1;i<=32;i+=1)
    {
        ball[i]=i;
    }

    srand((unsigned int)time(0));
    for(i=1;i<=6;i+=1)
    {

        j=rand()%(32-i);
        t=ball[i];
        ball[i]=ball[i+j];
        ball[i+j]=t;
        cout<<ball[i]<<" ";
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-14 10:22:43 | 显示全部楼层
GPT太强大了,哈哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 10:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表