2014-01-05 70 views
-2

生成用C不同的號碼所以基本上我在用C寫這個函數從1到50產生5個隨機數字:使用隨機

#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

如果你想從50你可以對1..50的序列進行混洗(使用rand()和一個像樣的shuffle算法,例如七次交換),然後從序列中取前五個數字。還有其他的方法,但這很像從你的描述中洗牌一副牌。 – 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 - 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'。 –

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