임의

2014-01-05 5 views
-2

를 사용하여 C에서 다른 번호를 생성 그러니까 기본적으로 내가 1 내지 50에서 5 개 난수를 생성하는 C에서이 함수를 쓴 :임의

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

int main() { 
    int c, n; 

    printf("Five random numbers from 1 to 50 \n"); 

    for (c = 1; c <= 5; c++) { 
     n = rand()%50 + 1; 
     printf("%d\n", n); 
    } 

    return 0; 
} 

와 나는 숫자가 확신 할 수있는 방법을 알고 싶습니다 이 코드에 의해 생성 된 코드는 모두 서로 다릅니다.

어떤 도움?

+0

당신은 당신이 이전을 저장하는 경우 당신이 그와 비교할 수 있지만, 그렇지 않으면 당신은 할 수없는, 임의의 본성 수 없습니다. 실제로 16 비트의 매우 가짜 의사 랜덤 성을 갖는'rand'는 사실상 거의 보장됩니다. 이 특정 설정은 균일 한 분배를 생성하지 않습니다. 더 나은 임의의 것을 사용하고 싶다면 나는 ['random_r'] (http://man7.org/linux/man-pages/man3/srandom_r.3.html) – Mgetz

+1

을 제안 할 것입니다 (rand()와 7-pass-swap과 같은 알맞은 shuffle-algorithm을 사용하여) 1..50의 순서를 섞어서 처음 다섯 자리 숫자를 순서대로 없앨 수 있습니다. 다른 방법이 있지만 이것은 설명에서 카드 더미를 섞는 것과 비슷합니다. – WhozCraig

+0

작은 예제 @Mgetz를 보여줄 수 있습니까? – DiogoCarou

답변

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

void swap(int *a, int *b){ 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
} 

int main() { 
    int i, c, n, size = 50; 
    int data[size]; 

    srand(time(NULL)); 
    for(i=0;i<size;++i) 
     data[i] = i+1; 

    printf("Five random numbers from 1 to 50 \n"); 

    for (c = 1; c <= 5; c++) { 
     n = rand()%size; 
     printf("%d\n", data[n]); 
     swap(&data[--size], &data[n]); 
    } 

    return 0; 
} 
+0

+1 이것은 훌륭한 * 답변이며, OP는 단계별로 작동하는 것이 현명합니다. – WhozCraig

+2

좋은 프로그램이지만 사람들이 복사하여 붙여 넣을 수 있도록 코드를 덤프하면 안됩니다. 그들이 배울 수 있도록 설명을 추가하십시오. – Kninnug

+0

참조 : [Knuth Fisher-Yates 알고리즘을 뒤섞 지 않는 방법] (http://www.i-programmer.info/programming/theory/2744-how-not-to-shuffle-the-kunth-fisher-yates -algorithm.html), [Shuffle - 카드 더미 섞기 - Knuth shufle] (http://tekpool.wordpress.com/2006/10/06/shuffling-shuffle-a-deck-of-cards-knuth-shuffle /) 및 [Wikipedia - Fisher-Yates Shuffle] (http://tekpool.wordpress.com/2006/10/06/shuffling-shuffle-a-deck-of-cards-knuth-shuffle/)을 참조하십시오. 또는 웹에 대한 자신의 평가를 수행하십시오. 'knuth shuffle proof'에 대한 Google 검색을 사용했습니다. –

0

각 숫자를 하나의 배열에 저장하고 새로운 난수를 기존 항목과 비교하여 확인하십시오.

0

이 같은 모든 숫자를 확인해야합니다 :

#include <time.h> 

int randomNumbers[5]; 
int c, d, n; 
bool itIsNew; 

//current time as random seed 
srand(time(0)); 

for (c = 1; c <= 5;) 
{ 
    n = rand() % 50 + 1; 
    itIsNew = true; 

    for(d = 1; d <= c; d++) 
    { 
     if(n == randomNumbers[d - 1]) 
     { 
      itIsNew = false; 
      break; 
     }  
    } 
    if(itIsNew) 
    { 
     randomNumbers[c - 1] = n; 
     c++; 
    } 
} 
+1

0에서 제한값 이하로 루프를 실행하는 법을 배워주세요 :'for (d = 0; d