| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2910 人关注过本帖
标题:求解,为什么不能重新检测数字是否重复
只看楼主 加入收藏
qq_s15
Rank: 2
等 级:论坛游民
帖 子:30
专家分:28
注 册:2015-7-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:35 
求解,为什么不能重新检测数字是否重复
代码如下。。下面有图片

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

void chongf(int b[], int j)//判断是否重复数字,如果是则重新生成一个随机数
{
    int a;
    for(a=1;a<18;a++)
    {
        if(b[j] == b[j-a])
        {
            b[j] = rand() % 35 + 1;
        }
    }
}

void main()
{
    int i[19];
    int a;
    int j;

    for(j=0; j<19; j++)
    {
        i[j] = rand() % 35 + 1;
        chongf(i,19);
    }
   
    for(j=0;j<19;j++)
    {
        printf("%d\t\n",i[j]);
    }
   
}



图片附件: 游客没有浏览图片的权限,请 登录注册
2016-01-04 15:38
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
以下是引用qq_s15在2016-1-4 15:38:56的发言:

代码如下。。下面有图片

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

void chongf(int b[], int j)//判断是否重复数字,如果是则重新生成一个随机数
{
    int a;
    for(a=1;a<18;a++)
    {
        if(b[j] == b[j-a])
        {
            b[j] = rand() % 35 + 1;
        }
    }
}

void main()
{
    int i[19];
    int a;
    int j;

    for(j=0; j<19; j++)
    {
        i[j] = rand() % 35 + 1;
        chongf(i,19);
    }
   
    for(j=0;j<19;j++)
    {
        printf("%d\t\n",i[j]);
    }
   
}


//你的这个例子太好了,帮你发现了问题,如果第一个不是7,而是另一个不重复的数,你就无法发现这个问题了,C中数组下标从0开始
程序代码:
void chongf(int b[], int j)//判断是否重复数字,如果是则重新生成一个随机数
{
    int a;
    for(a=1;a<18;a++)//a从0开始
    {
        if(b[j] == b[j-a])
        {
            b[j] = rand() % 35 + 1;
        }
    }
}
2016-01-04 18:00
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
这代码还有点问题,你测试的代码每次输出结果应该都是一样吧,得加一个以时间为种子的语句,产生随机数
2016-01-04 18:05
qq_s15
Rank: 2
等 级:论坛游民
帖 子:30
专家分:28
注 册:2015-7-18
收藏
得分:0 
回复 3楼 wengbin
对。没错。是需要添加一个时间种子。有一个问题就是为什么不会检查重复的数字呢。
2016-01-04 20:03
qq_s15
Rank: 2
等 级:论坛游民
帖 子:30
专家分:28
注 册:2015-7-18
收藏
得分:0 
回复 2楼 wengbin
为什么只有第一个7才会有重复数呢。。我知道是数组是从0开始的。
2016-01-04 20:05
qq_s15
Rank: 2
等 级:论坛游民
帖 子:30
专家分:28
注 册:2015-7-18
收藏
得分:0 
回复 3楼 wengbin
图片附件: 游客没有浏览图片的权限,请 登录注册



不是7也一样有重复的数字。
2016-01-04 20:22
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
从你的代码看,有几处错误:
1,数组溢出危险,你调用函数的语句是chongf(i,19);19对应chongf里的参数j,然后你用b[j]和数组其他元素比较是否重复,很显然数组元素编号是从0-18,不存在b[19]的这个元素。
2,算法错误,你的循环是从将b[19]和b[1]至b[18]进行比较,发现相同随机产生b[19]的值,且不说你没有比较b[0],假如你发现在b[4]处发现相同,你怎么能保证再产生的随机值一定会和a[0]至a[3]的值不同呢?因为你循环的变量a已经自增到4了,你并没有在发现相同后复位a的值为0.
3,其实你主函数已经产生的随机值和chongf函数未发生任何关系,主函数是从a[0]至a[18]递增产生的随机值,而你chongf函数在发现相同后仅修改溢出的a[19]位置的值,然并卵啊!
4,设计函数的一个关键的然原则是功能单一性,你是判断重复的就判断重复,不要又担任产生随机数的任务,如果你需要一次性给定不重复的随机数,则不要又在主函数里使用随机数。

以上几点仅供参看,这是一个非常基本的代码设计,完成这些楼主还是多动脑子吧。

[此贴子已经被作者于2016-1-4 20:43编辑过]

收到的鲜花
  • qq_s152016-01-06 10:47 送鲜花  5朵  

能编个毛线衣吗?
2016-01-04 20:42
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

我在手機上的測試結果
還有沒include <stdlib.h>
2016-01-04 20:50
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
回复 7楼 wmf2014
中肯,讚一個
2016-01-04 20:55
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:10 
呃,帮你改的时候就看到你算法有问题,问题wmf2014版主已经告诉你了,下面是我改的代码,呃,算法本来没啥的,可加了一个语句后就发生栈溢出错误了,找了好半天才找到错的地方。下面这串代码,应该是没有重复的了。
程序代码:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
void chongf(int* ar, int d)//判断是否重复数字,如果是则重新生成一个随机数
{
    for(int i = 0; i<d; i++)
    {
        if(ar[i] == ar[d])
        {
            ar[d] = rand() % 35 + 1;
            chongf(ar, d);
        }
    }
}

int main()
{
    int arr[19];
    srand(time(0));
    for(int i = 0; i<19; i++)
    {
        arr[i] = rand() % 35 + 1;
        chongf(arr, i);
    }
    for(int i = 0; i<19; i++)
    {
        printf("%d\n",arr[i]);
    }
    printf("\n");
    //system("pause");
    return 0;
}


[此贴子已经被作者于2016-1-4 21:36编辑过]

收到的鲜花
  • qq_s152016-01-06 10:47 送鲜花  5朵  
2016-01-04 21:32
快速回复:求解,为什么不能重新检测数字是否重复
数据加载中...
 
   



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

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