2011-09-29 54 views
18

Tôi muốn tạo các số ngẫu nhiên (giả) giữa 0 và một số nguyên. Tôi không quan tâm nếu họ không quá ngẫu nhiên. Tôi có quyền truy cập vào thời gian hiện tại trong ngày nhưng không truy cập vào chức năng rand. Bất cứ ai có thể nghĩ ra một cách đủ mạnh mẽ để tạo ra những? Có lẽ, loại bỏ một số bit từ thời gian trong ngày và lấy modulo số nguyên của tôi hoặc một cái gì đó?Làm cách nào để tạo các số ngẫu nhiên mà không có hàm rand()?

Tôi đang sử dụng c.

+2

Điều này nghe giống như bài tập về nhà. Nếu có, bạn nên gắn thẻ bằng thẻ "bài tập về nhà". – jadarnel27

+0

Nếu bạn có quyền truy cập vào google.com, hãy thử tìm kiếm điều này: "trình tạo số ngẫu nhiên". – DwB

+2

Tại sao không chỉ đọc từ '/ dev/random'? Hoặc sử dụng phương pháp xkcd. –

Trả lời

19

Nếu sau một máy phát ngẫu nhiên giả cực kỳ đơn giản, bạn chỉ có thể sử dụng Linear Feedback shift Register.

Các bài viết wikipedia có một số đoạn mã để bạn có thể nhìn vào, nhưng về cơ bản mã cho một máy phát điện 16-bit sẽ giống như thế này (mát xa nhẹ nhàng từ trang đó ...)

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

Chính xác những gì tôi cần! một giải pháp rất đơn giản và thanh lịch – AnkurVj

7

Xem xét việc triển khai trình tạo giả ngẫu nhiên (ví dụ "bên trong" rand()) của riêng bạn, ví dụ: Mersenne twister được đánh giá cao.

0

Bạn có thể lấy "Tiny Mersenne Twister" ở đây: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html

nó là tinh khiết c và đơn giản để sử dụng. Ví dụ. chỉ cần sử dụng thời gian:

#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

Tôi không thể sử dụng bất kỳ thư viện bổ sung nào! – AnkurVj

+0

Điều gì có ý nghĩa với bạn? cách bao gồm một số khác #include "tinymt32.c"? – Dominic

7

Đối các số nguyên "không quá ngẫu nhiên", bạn có thể bắt đầu với thời gian UNIX hiện tại, sau đó sử dụng công thức đệ quy r = ((r * 7621) + 1) % 32768;. Số nguyên ngẫu nhiên thứ n giữa 0 (bao gồm) và M (độc quyền) sẽ là r % M sau lần lặp thứ n.

Đây được gọi là bộ tạo đồng tuyến tính.

Công thức đệ quy là những gì bzip2 sử dụng để chọn trục trong triển khai quicksort của nó. Tôi sẽ không biết về các mục đích khác, nhưng nó hoạt động khá tốt cho một đặc biệt này ...

-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

Bạn có thể mang lại lời giải thích cho mã của bạn được không! Và hãy đọc về [cách viết câu trả lời hay] (http://stackoverflow.com/help/how-to-answer) – eliasah

-1

Dưới chương trình tạo ra số ngẫu nhiên, mà không sử dụng rand fuction

#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; 

} 

Có thể là nó rất hữu ích

-1

Một trong những bộ tạo số ngẫu nhiên đơn giản nhất mà không quay trở lại allways cùng giá trị:

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; 
    } 

Bạn có thể có thời gian để thiết lập giá trị bắt đầu nếu bạn không muốn rằng chuỗi bắt đầu luôn luôn với cùng một giá trị.

+0

Ai đó có thể giải thích phiếu bầu xuống? – 12431234123412341234123

Các vấn đề liên quan