2011-09-29 54 views
18

我想生成0和某個整數之間的(僞)隨機數。我不介意他們是不是太隨意了。我可以訪問一天中的當前時間,但不能訪問rand函數。任何人都可以想到一個足夠強大的方法來產生這些?也許,從一天中的某個時刻丟棄一些數據,並取模我的整數或什麼?如何在不使用rand()函數的情況下生成隨機數字?

我正在使用c。

+2

這聽起來像作業。如果是這樣,你應該用「家庭作業」標籤標記它。 – jadarnel27

+0

如果您有權訪問google.com,請嘗試搜索:「random number generator」。 – DwB

+2

爲什麼不直接從'/ dev/random'讀取?或者使用xkcd方法。 – 2011-09-29 20:21:18

回答

19

如果你是一個超簡單的僞隨機生成後,你可以只使用一個Linear Feedback shift Register

維基百科的文章有一些代碼片段讓你看看,但基本上是一個16位的生成代碼看起來像這樣(從該頁面輕輕按摩...)

unsigned short lfsr = 0xACE1u; 
    unsigned bit; 

    unsigned rand() 
    { 
    bit = ((lfsr >> 0)^(lfsr >> 2)^(lfsr >> 3)^(lfsr >> 5)) & 1; 
    return lfsr = (lfsr >> 1) | (bit << 15); 
    } 
+0

正是我需要的!一個非常簡單和優雅的解決方案 – AnkurVj

7

看看你自己的實現僞隨機生成器(什麼是「內部」rand()),例如Mersenne twister受到高度重視。

0

你可以得到「微小的梅森難題」在這裏:http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html

是純C,簡單易用。例如。只是使用時間:

#include "tinymt32.h" 
// And if you can't link: 
#include "tinymt32.c" 

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

int main(int argc, const char* argv[]) 
{ 
    tinymt32_t state; 
    uint32_t seed = time(0); 

    tinymt32_init(&state, seed); 

    for (int i=0; i<10; i++) 
      printf("random number %d: %u\n", i, (unsigned int)tinymt32_generate_uint32(&state)); 
} 
+0

我不能使用任何額外的庫! – AnkurVj

+0

你的意思是不能做什麼? 如何加入另一個 #include「tinymt32.c」? – Dominic

7

對於「不太隨機」的整數,你可以從當前的UNIX時間開始,然後使用遞歸公式r = ((r * 7621) + 1) % 32768;。在第n次迭代之後,在0(含)和M(不含)之間的第n個隨機整數將是r % M

這被稱爲線性同餘發生器。

遞歸公式是bzip2用於在其快速排序實現中選擇樞軸。我不知道其他的目的,但它工作得很好了這個特殊的...

-2
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
int main() 
{ 
unsigned int x,r,i; 
// no of random no you want to generate 
scanf("%d",&x); 
// put the range of random no 
scanf("%d",&r); 
unsigned int *a=(unsigned int*)malloc(sizeof(unsigned int)*x); 
for(i=0;i<x;i++) 
printf("%d ",(a[i]%r)+1); 
free(a); 
getch(); 
return 0; 
} 
+0

您能給我們帶來一個解釋你的代碼嗎!並請閱讀[如何寫出一個好答案](http://stackoverflow.com/help/how-to-answer) – eliasah

-1

下面的程序產生的隨機數,而不使用蘭特機能的研究

#include<stdio.h> 
#include<time.h> 
int main() 
{ 
    int num; 
    time_t sec; 
    sec=time(NULL); 
    printf("Enter The Number\n"); 
    scanf("%d",&num); 
    if(num>0) 
    { 
     for(;;) 
     { 
      sec=sec%3600; 
      if(num>=sec) 
      { 
      printf("%ld\n",sec); 
      break; 
      } 
      sec=sec%num; 
     } 
    } 
    else 
    { 
     printf("Please Enter Positive Value\n\n\n*****Thanks For Visit*****\n\n\n"); 
    } 
    return 0; 

} 

可能是有益的

-1

最簡單的隨機數發生器,它不會永諾返回相同的值:

uint16_t simpleRand(void) 
    { 
    static uint16_t r = 5531; //dont realy care about start value 
    r+=941; //this value must be relative prime to 2^16, so we use all values 
    return r; 
    } 

如果您不希望序列總是以相同的值開始,您可能可以獲得設置開始值的時間。

+0

有人可以解釋倒票嗎? – 12431234123412341234123

相關問題