优化C中随机数的代码而不重复

时间:2016-05-04 07:51:54

标签: c random

我做了一个代码,它会在屏幕上显示10个没有重复的随机数。我想知道我们是否可以优化代码,或者您是否有更好更简单的方法来执行此请求。 谢谢!!

int main(){
int nbr = 0; srand(time(NULL));
int arr[10], i, j, flag;

for (i = 0; i < 10; i++)
{
    do
    {
        nbr = rand() % 10 + 1;
        flag = 1;
        for (j = 0; j  < i; j ++)
        {
            if (nbr == arr[j])
            {
                flag = 0;
                break;
            }
        }

    } while (!flag);
    arr[i] = nbr;
}

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



system("PAUSE");
return 0;
}

2 个答案:

答案 0 :(得分:1)

所以,如果我得到你在这里尝试做的事情,那就是:

以随机顺序(给定rand() % 10 + 1

生成1到10之间的数字数组

而不是反复试验我建议使用以下算法:

  • 以1 ... 10
  • 填充arr
  • shuffle arr

这将运行得更快

答案 1 :(得分:0)

虽然我同意Artiz的工作提供的解决方案,但这将导致回答何时停止改组的难题。

要解决此问题,您可以使用以下解决方案(将使用更多内存,但时间更短):

1 创建一个数值为{1}的数组temp(有序,非随机)

2 跟踪数组的长度length(10)

3 生成0到rand_i之间的随机索引length - 1

4 temp[rand_i]复制到最终数组中的下一个位置

5 temp[rand_i]

覆盖temp[length-1]

6 减少length

7 迭代步骤3 - 6直到你的阵列被填满(10次)

这样可以消除过多的循环,以及何时停止洗牌的问题

编辑:包括代码

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

int main(){
int nbr = 0; srand(time(NULL));
int arr[10], i, j, flag;
int temp[10] = {1,2,3,4,5,6,7,8,9,10};
int length = 10;


for (i = 0; i < 10; i++)
{

        nbr = rand() % length;  // Generate random index between 0 and length - 1

       arr[i] = temp[nbr];      // Copy value from random index in temp to next index in arr

       // Now since temp[nbr] is already taken (copied to arr) we should replace it by last available value in temp (temp[lenght])
       // and in the next iteration we will create a value between 0 and length -1. This will keep values not yet taken from temp in 
       // contiguous order

        temp[nbr] = temp[length-1];
        length--;
}

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



return 0;
}