Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 32 kết quả

Đề tài: [ Solved ]Tạo số ngẫu nhiên không trùng nhau

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    18

    Mặc định [ Solved ]Tạo số ngẫu nhiên không trùng nhau

    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    void main( void )
    {
    int i;
    
    /* Seed the random-number generator with current 
    time so that the numbers will be different every time
    we run.
    */
    srand( (unsigned)time( NULL ) );
    
    /* Display 10 numbers. */
    for( i = 0; i < 10;i++ )
    printf( " %6d\n", rand() );
    }
    với code này các bạn có thể cho mình biết là có chắc chắn là các số được sinh ra là không trùng nhau không,và tại sao lại thế

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    336

    mỗi lần bạn chạy chương trình trên nó sẽ in ra 10 số, và 10 số lần 1 thì khác 10 số lần 2 chứ ko chắc là 10 số ko trùng nhau

  3. #3
    Ngày gia nhập
    01 2008
    Bài viết
    18

    mỗi lần bạn chạy chương trình trên nó sẽ in ra 10 số, và 10 số lần 1 thì khác 10 số lần 2 chứ ko chắc là 10 số ko trùng nhau
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    void main( void )
    {
    int i;
    
    
    
    /* Display 10 numbers. */
    for( i = 0; i < 10;i++ ){
    srand( (unsigned)time( NULL ) );
    printf( " %6d\n", rand() );}
    }
    thế nếu vậy ta để code thế này thì có thể in ra 10 số trong 1 lần luôn khác nhau không,sẽ luôn không trùng nhau trong 1 lần
    cậu có thể cho tớ thuật toán in ra các số ngẫu nhiên không trùng nhau không

  4. #4
    Ngày gia nhập
    04 2008
    Bài viết
    336

    thuật toán thì tớ ko biết -_-' các thuật toán tìm số ngẫu nhiên ko trùng lặp đc. bàn rất nhiều bạn có thể google ... còn dựa trên hàm có sẵn thì tớ có thể demo 1 cái như sau
    PHP Code:
    #include<conio.h>
    #include<iomanip.h>
    #include<stdlib.h>
    #include<iostream.h>

    int timx(int a[],int n,int x)// co gia tri x trong mang a do dai n hay ko
    {
        
    int i;
        if(
    n==0)return 0;
        for(
    i=0;i<n;++i)
            if(
    a[i]==x)return 1;
        return 
    0;
    }


    void gen_random(int a[],int n)// tao n gia tri ngau nhien luu vao mang a
    {
        
    int i,x;
        
    x=random(100);
        for(
    i=0;i<n;++i)
        {
            while(
    timx(a,i,x))
                
    x=random(100); // tao ngau nhien tu 0->99
            
    a[i]=x;
        }
    }

    void main()
    {
        
    clrscr();
        
    randomize();// cai nay de moi lan chay ko trung lap
        
    int a[10],i;

        
    gen_random(a,10);

        for(
    i=0;i<10;++i)
            
    cout<<" "<<a[i];
        
    getch();

    Đã được chỉnh sửa lần cuối bởi 6220119 : 28-07-2008 lúc 10:06 AM.

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Code:
    int timx(int a[],int n,int x)// co gia tri x trong mang a do dai n hay ko
    {
        int i;
        if(n==0)return 0;
        for(i=0;i<n;++i)
            if(a[i]==x)return 1;
        return 0;
    }
    so sánh thế này ít só không sao,nhiều số thì ốm luôn,với lại cái random này ứng dụng phần nhiều là cho nhiều số,cậu làm thế này mỗi lần tạo số lại đêm for chạy từ đầu đến cuối thì toi
    cậu có thể tham khảo cách này:
    tạo ra được số ngẫu nhiên từ 0 ->n gán số từ 0 đến n này vào mảng với địa chỉ trùng với giá trị của nó VD A[1]=1
    sau khi tạo được số nào thì lập tức xóa số đó luôn và đến lúc đó chỉ rand địa chỉ của các số thôi
    Đã được chỉnh sửa lần cuối bởi AlexF : 28-07-2008 lúc 10:17 AM.

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    503

    Mặc định [ Solved ]Tạo số ngẫu nhiên không trùng nhau

    Trích dẫn Nguyên bản được gửi bởi jacking_nguyen1 Xem bài viết
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    void main( void )
    {
    int i;
    
    
    
    /* Display 10 numbers. */
    for( i = 0; i < 10;i++ ){
    srand( (unsigned)time( NULL ) );
    printf( " %6d\n", rand() );}
    }
    thế nếu vậy ta để code thế này thì có thể in ra 10 số trong 1 lần luôn khác nhau không,sẽ luôn không trùng nhau trong 1 lần
    Không đảm bảo được, vì hai lần gọi time(NULL) liên tiếp có thể trả lại cùng một giá trị. Hơn nữa, kể cả khi hai lần gọi time(NULL) liên tiếp trả lại hai giá trị khác nhau, rand() vẫn có thể trả lại cùng một giá trị ở lần gọi đầu tiên.

    Trích dẫn Nguyên bản được gửi bởi jacking_nguyen1 Xem bài viết
    cậu có thể cho tớ thuật toán in ra các số ngẫu nhiên không trùng nhau không
    Nói chung, có 2 cách:

    a/ hoán vị các số của một mảng mà giá trị ban đầu của mảng ấy là một dãy số tự nhiên:
    Code:
    int f[N];
    for( x = 0; x < N; x++) f[x] = x;
    for( x = 0; x < N; x++) swap( f[x], f[ rand( x, N-1 ) ] );
    for( x = 0; x < N; x++) printf( "%d ", f[x] );
    Trong đó:
    swap(a,b) hoán trị hai biến a, b,
    rand(a,b) trả lại một giá trị ngẫu nhiên trong khoảng a...b. Khoảng ở đây là khoảng đóng, nghĩa là gồm cả a và b.

    Cách này chỉ dùng được khi sinh ra ít số, ví dụ, không quá vài triệu số.




    b/ viết một hàm hoán vị giả ngẫu nhiên, tức là một hàm f: X -> X có giá trị hàm số rất "ngẫu nhiên" khi cho đối số chạy tuần tự, nhưng có tính chất song ánh ( f(x) != f(x') nếu x != x' ); rồi áp dụng hàm này lần lượt lên các số tự nhiên:

    Code:
    int f( int x )
    {
    ....
    }
    
    for(int x = 0; x < N; x++ )   printf( "%d ", f(x) );
    Cách này hơi mất công một chút, nhưng không bị tốn bộ nhớ cho mảng, nhờ thế có thể sinh ra rất nhiều số, ví dụ, hàng tỉ số.
    Đã được chỉnh sửa lần cuối bởi Ada : 28-07-2008 lúc 11:04 AM.

  7. #7
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Trích dẫn Nguyên bản được gửi bởi coder_gate Xem bài viết
    so sánh thế này ít só không sao,nhiều số thì ốm luôn,với lại cái random này ứng dụng phần nhiều là cho nhiều số,cậu làm thế này mỗi lần tạo số lại đêm for chạy từ đầu đến cuối thì toi
    dĩ nhiên rồi vì thế tớ chỉ làm với 10 số thôi

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    b/ viết một hàm hoán vị giả ngẫu nhiên, tức là một hàm f: X -> X có giá trị hàm số rất "ngẫu nhiên" khi cho đối số chạy tuần tự, nhưng có tính chất song ánh ( f(x) != f(x') nếu x != x' ); rồi áp dụng hàm này lần lượt lên các số tự nhiên:

    Code:
    for(int x = 0; x < N; x++ )
         printf( "%d ", f(x) );
    Cách này hơi mất công một chút, nhưng không bị tốn bộ nhớ cho mảng, nhờ thế có thể sinh ra rất nhiều số, ví dụ, hàng tỉ tỉ số.
    cách này giống mấy số đc. cho theo công thức (VD như Fibonacci) vậy có nên lưu vào mảng rồi hoán vị giống cách 1 của bạn ? nếu thế thì nó sẽ giống ngẫu nhiên hơn ^^
    Đã được chỉnh sửa lần cuối bởi 6220119 : 28-07-2008 lúc 11:04 AM.

  8. #8
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    cách này giống mấy số đc. cho theo công thức (VD như Fibonacci) vậy có nên lưu vào mảng rồi hoán vị giống cách 1 của bạn ? nếu thế thì nó sẽ giống ngẫu nhiên hơn ^^
    cậu khôh thấy tác ja có câu này ah
    viết một hàm hoán vị giả ngẫu nhiên, tức là một hàm f: X -> X có giá trị hàm số rất "ngẫu nhiên" khi cho đối số chạy tuần tự, nhưng có tính chất song ánh ( f(x) != f(x') nếu x != x' ); rồi áp dụng hàm này lần lượt lên các số tự nhiên:

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    503

    Trích dẫn Nguyên bản được gửi bởi 6220119 Xem bài viết
    cách này giống mấy số đc. cho theo công thức (VD như Fibonacci) vậy có nên lưu vào mảng rồi hoán vị giống cách 1 của bạn ? nếu thế thì nó sẽ giống ngẫu nhiên hơn ^^
    Không cần, nếu viết tốt thì f() đã đủ ngẫu nhiên rồi. Chính bản thân rand() cũng chỉ sinh một dãy số theo một công thức nhất định, rất đơn giản, mà thôi.

  10. #10
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Thanks. Mình vừa xem hàm rand của C ^^ lúc nãy hỏi vì còn hơi mơ hồ nhưng giờ thì hiểu rồi ^^
    PHP Code:
    #define MULTIPLIER      0x015a4e35L
    #define INCREMENT       1
    static  long    Seed 1;
    int rand(void)
    {
            
    Seed MULTIPLIER Seed INCREMENT;
            return((int)(
    Seed >> 16) & 0x7fff);


Các đề tài tương tự

  1. Tạo một chuỗi ngẫu nhiên không trùng lặp trong lập trình C#
    Gửi bởi vinhson trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 17
    Bài viết cuối: 20-05-2012, 02:37 PM
  2. Lập trình C++ Cách sử dụng hàm random để tạo số ngẫu nhiên không trùng nhau?
    Gửi bởi reach_phan trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 10-11-2011, 09:53 PM
  3. Tạo số ngẫu nhiên không trùng nhau lưu vào mảng?
    Gửi bởi icde trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 20-09-2009, 09:55 PM
  4. [ Solved ]Khởi tao mảng ngẩu nhiên
    Gửi bởi kieutrongduc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 21-09-2008, 02:33 PM
  5. [ Solved ] Sắp xếp ngẫu nhiên các số.
    Gửi bởi aMember trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 07-08-2008, 09:03 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn