我做了一个代码,它会在屏幕上显示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;
}
答案 0 :(得分:1)
所以,如果我得到你在这里尝试做的事情,那就是:
以随机顺序(给定rand() % 10 + 1
)
而不是反复试验我建议使用以下算法:
arr
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;
}