我是靠谱客的博主 踏实日记本,最近开发中收集的这篇文章主要介绍C语言 — 解决随机函数产生相同数字的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我们有时候会用随机函数来产生随机数字,如下:
UINT randomArr = {0, 0, 0, 0, 0, 0} 
        EBool redBallBool = EBool_True; 

        /* generate a seed of random() */
        srand((UINT)time(NULL));

        for (i=0; i<number; i++)
        {
                randomArr[i] = (UINT)rand() % maxRange + 1;       
        }
但是,运行本程序后,随机函数产生的数字有时候会产生相同的数字。而我们却需要每个数字都不同,那么我们需要对每个产生的数字过滤。于是需要将随机产生的数字和已经保存在数组中的数字进行对比,于是进行了更改,程序如下:
for (i=0; i<number; i++)
        {
                temp = (UINT)rand() % maxRange + 1;       
                for (j=0; j<i; j++)
                {
                        if (temp == randomArr[j])
                        {
                                 redBallBool = EBool_False;
                                 break;
                        }
                        redBallBool = EBool_True;
                }
                if (redBallBool)
                {
                        randomArr[i] = temp;
                        break;
                }
        }
但是,这样任然出现意外情况—— 数字中有为0的元素。奇怪了,我们的temp是不可能产生0的,那么为什么还会有0呢? 这是因为我们的数组初始化的时候元素都为0,那么数字中有0的原因很可能就是程序根本就没有更改数字的初始值。 我们分析后结果的确是这样的。
分析如下:
我们假设第一次(i=0时)随机产生的值为5,即randomArr[0] = 5;而且第二次(i=1)也产生了5,那么if (temp == randomArr[j])这条语句成立,执行语句redBallBool = EBool_False;使得下面的if (redBallBool)语句没有执行,此时i++,进入下一次循环,使得randomArr[1]的值没有改变,仍然为0 。所以,我们在随机产生的数字中看到了随机不可能产生的0.

那么,如何避免这个问题呢?我的解决办法如下:
for (i=0; i<number; i++)
        {                
                for (;;)
                {
                        temp = (UINT)rand() % maxRange + 1;       
                        for (j=0; j<i; j++)
                        {
                                if (temp == randomArr[j])
                                {
                                         redBallBool = EBool_False;
                                         break;
                                }
                                redBallBool = EBool_True;
                        }
                        if (redBallBool)
                        {
                                randomArr[i] = temp;
                                break;
                        }
                }
        }
加了一个死循环,这样做的目的是当出现如上所述的跳过类似于i=1时候的数组时候,仍然在for(;;)循环中,知道产生的不同的数字存在randomArr数组后,再break,接着进入下一次循环。




最后

以上就是踏实日记本为你收集整理的C语言 — 解决随机函数产生相同数字的问题的全部内容,希望文章能够帮你解决C语言 — 解决随机函数产生相同数字的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部