int i,j,vec[15]={0};
srand (time(NULL));
for (i=0;i<15;i++){
vec[i]=rand() % 25+1;
for (j=0;j<15;j++){
if (i!=j){
while(vec[i]==vec[j]){
vec[i]=rand() % 25+1;
}
}
}
printf("%d\n",vec[i]);
}
return 0;
}
代码仍然给我重复的数字
示例: 24 3 7 20 18 10 12 17 9 7 4 25 13 15 21
我无法弄清楚该怎么做
答案 0 :(得分:0)
重置j
循环中的while
:
for (j=0;j<i;j++){ //Use j<i
if (i!=j){
while(vec[i]==vec[j]){
vec[i]=rand() % 25+1;
j=-1;//-1 because in the next iteration,j will start from 0
}
}
}
答案 1 :(得分:0)
您可以使用数组
int randNumbers [25]; //从0到25开始填充它 将随机索引中的数字与数组中的最后一个数字交换后,将数字随机化,范围在0到25之间
随机0到23 等等....
int main(int argc, char **argv) {
static const int size = 25;
int numbers[size];
for( int i = 0; i < size; i++ ){
numbers[i] = i;
}
srand (time(NULL));
for( int i = 0; i < size; i++ ){
int rIndex = rand()%(size - i);
int rNum = numbers[rIndex];
numbers[rIndex] = numbers[size-i];
printf("%d ", rNum);
}
return 0;
}
O(n)复杂性......
答案 2 :(得分:0)
你的循环混乱了。逻辑是:生成一个随机数,直到找到一个不在列表中的随机数。
你这样做,你会在检查循环中生成一个新数字。但这并不奏效。假设您正在生成第4个数字并且发现它等于第三个数字。然后你生成一个新的,它可能等于你已经检查过的任何一个。
您还可以在j > i
时检查未初始化的元素。你的内部循环最多只能运行i
。
所以:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
int vec[15] = { 0 };
int i, j;
srand(time(NULL));
for (i = 0; i < 15; i++) {
int okay = 0;
while (!okay) {
vec[i] = rand() % 25 + 1;
okay = 1;
for (j = 0; j < i; j++) {
if (vec[i] == vec[j]) okay = 0;
}
}
printf("%d\n", vec[i]);
}
return 0;
}
使用okay
变量看起来仍然有些尴尬。在我看来,检查重复项应该是一个单独的功能:
int contains(int arr[], int n, int x)
{
while (n--) {
if (arr[n] == x) return 1;
}
return 0;
}
int main()
{
// snip ...
for (i = 0; i < 15; i++) {
do {
vec[i] = rand() % 25 + 1;
} while (contains(vec, i, vec[i]));
printf("%d\n", vec[i]);
}
// snip ...
}
在您的情况下,可能的数字范围并不比数组元素的数量大。您还可以创建有序数组{1, 2, 3, ..., 25}
,然后shuffle it并仅使用前15个元素。
答案 3 :(得分:0)
你是否真的试图改组数字,而不是用数据填充数组? (看起来你想要一个数字从1到25但是按随机顺序的数组。)rand()可以给你重复的数字(毕竟它们是 random !)
试试这个:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
int
main( int argc, char **argv )
{
int i, vec[25];
for (i = 0; i < 25; ++i) vec[i] = i + 1;
/* Shuffle entries */
srand( time( 0 ) );
for (i = 0; i < 1000; ++i) {
int a = rand( ) % 25;
int b = rand( ) % 25;
if (a != b) {
int tmp = vec[a];
vec[a] = vec[b];
vec[b] = tmp;
}
}
/* Print shuffled array */
for (i = 0; i < 25; ++i) printf( "%d: %d\n", i, vec[i] );
return 0;
}
答案 4 :(得分:0)
#include<stdio.h>
#include<stdlib.h>
int inArray(int, int, int*);
int main()
{
int i,j,vec[15]={0};
int temp;
srand (time(NULL));
for (i=0;i<15;i++){
temp =rand() % 25+1;
while(inArray(i+1,temp, vec) == 1){
temp = rand() % 25+1;
}
vec[i] = temp;
printf("VECT[%d] \t= %d\n",i,vec[i]);
}
return 0;
}
int inArray(int count, int input, int* array){
int i = 0;
for(i=0; i<count; i++){
if(input == array[i]){
return 1;
}
}
return 0;
}
给出一个输出:
VECT[0] = 24
VECT[1] = 19
VECT[2] = 1
VECT[3] = 25
VECT[4] = 22
VECT[5] = 18
VECT[6] = 7
VECT[7] = 8
VECT[8] = 12
VECT[9] = 21
VECT[10] = 11
VECT[11] = 6
VECT[12] = 23
VECT[13] = 20
VECT[14] = 15
检查已关闭,您将更改并且不会中断,允许将其更改为之前的值。