C语言 — 解决随机函数产生相同数字的问题
2014-02-28 16:01
232 查看
我们有时候会用随机函数来产生随机数字,如下:
但是,运行本程序后,随机函数产生的数字有时候会产生相同的数字。而我们却需要每个数字都不同,那么我们需要对每个产生的数字过滤。于是需要将随机产生的数字和已经保存在数组中的数字进行对比,于是进行了更改,程序如下:
但是,这样任然出现意外情况—— 数字中有为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.
那么,如何避免这个问题呢?我的解决办法如下:
加了一个死循环,这样做的目的是当出现如上所述的跳过类似于i=1时候的数组时候,仍然在for(;;)循环中,知道产生的不同的数字存在randomArr数组后,再break,接着进入下一次循环。
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语言解决逻辑问题幸运的数字
- 排列平方数 若干不同的数字,排列组合后能产生多少个平方数? 下面的代码解决了这个问题。
- 如何用c语言解决数字河问题
- .Net中关于Random类产生的随机数相同问题解决
- USB序列号相同产生的问题及解决
- 解决for循环里面产生相同随机数的问题
- [ASP.NET 控件实作 Day29] 解决 DropDownList 成员 Value 值相同产生的问题
- C语言解决哲学家就餐问题
- 【解决】Spark运行时产生的临时目录的问题
- 赋值构造函数的用法即指针悬挂问题的产生和解决(中)——解决之道
- 移植linux2.6.38产生的问题及其解决方法
- GridView导出数据到excel数字变为科学记数法的问题的解决办法
- 控制台应用程序调用MFC DLL产生的对话框,解决对话框dlg.DoModal报错问题
- 利用ajaxSubmit提交的时候,解决多个input name相同的问题
- 将Capicom调用代码封装到ActiveX——解决javascript调Capicom读取数字证书信息时,IE弹出安全提示的问题
- 解决 putty 使用小键盘数字键乱码的问题
- C语言解决数学问题
- 《C语言及程序设计》实践项目——利用switch语句解决问题