cho mình hỏi cách tạo số ngẫu nhiên

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • chizardxx
    Nhập môn đệ tử
    • Oct 2007
    • 7

    #1

    cho mình hỏi cách tạo số ngẫu nhiên

    mình muốn tạo một số ngẫu nhiên nằm trong 1 khoảng cho trước [a,b] cụ thể là [-2.5,+2.5]
    dùng pic6f877a
    bạn nào có thể gợi ý cho mình được ko
  • chizardxx
    Nhập môn đệ tử
    • Oct 2007
    • 7

    #2
    mình chỉ lấy số ngẫu nhiên có 1 chữ số hàng thập phân.
    Mình nghĩ thế này ko biết đã ổn chưa
    đặt rand_max = 51 (vì hàm rand chỉ cho số nguyên dương)
    i = rand(); // i sẽ nhận giá trị ngẫu nhiên từ 0 đến 50.
    i = 25 - i; // i sẽ nhận giá trị từ -25 đến 25
    i = i/10 //[-2.5,2.5]
    có vẻ không hay lắm , mình ko biết đc ko

    Comment

    • bien_van_khat
      ...Damned...
      • Apr 2006
      • 503

      #3
      Về ý tưởng mình nghĩ OK.

      Bạn chỉ cần chú ý về kiểu dữ liệu, vì rand() trả về kiểu số nguyên, trong khi bạn đang cần số thực.
      - Xin đọc trước khi post bài

      Xin đặt code trong thẻ [ code ] [ /code ]

      Comment

      • phamminhtuan
        Super Moderator
        • Feb 2006
        • 150

        #4
        Đây là code tính random của CCS C - thư viện stdlib.h, mô phỏng 10 lần ra giá trị "ngẫu nhiên" chỉ có 1.
        PHP Code:
        unsigned int32 _Randseed;
        
        unsigned int16 rand(void)
        {
           _Randseed = _Randseed * 1103515245 + 12345;
           return ((unsigned int16)(_Randseed >> 16) % RAND_MAX);
        }
        
        void srand(unsigned int32 seed)
        {
           _Randseed = seed;
        } 
        
        Ai có giải thuật tính random khác không nhỉ, như cái dùng Timer chẳng hạn, cho nó chạy tự do, khi nào cần thì cứ lấy giá trị, muốn lấy giới hạn bao nhiêu thì cứ module bấy nhiếu, muốn thành thập phân thì giống như chizardxx nói
        Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
        http://www.picvietnam.com/forum/showthread.php?t=1263

        Comment

        • bien_van_khat
          ...Damned...
          • Apr 2006
          • 503

          #5
          Nguyên văn bởi phamminhtuan View Post
          Đây là code tính random của CCS C - thư viện stdlib.h, mô phỏng 10 lần ra giá trị "ngẫu nhiên" chỉ có 1.
          PHP Code:
          unsigned int32 _Randseed;
          
          unsigned int16 rand(void)
          {
             _Randseed = _Randseed * 1103515245 + 12345;
             return ((unsigned int16)(_Randseed >> 16) % RAND_MAX);
          }
          
          void srand(unsigned int32 seed)
          {
             _Randseed = seed;
          } 
          
          Ai có giải thuật tính random khác không nhỉ, như cái dùng Timer chẳng hạn, cho nó chạy tự do, khi nào cần thì cứ lấy giá trị, muốn lấy giới hạn bao nhiêu thì cứ module bấy nhiếu, muốn thành thập phân thì giống như chizardxx nói
          Đây là giải thuật để tạo ra dãy uniform pseudo-random (tạm dịch: giả ngẫu nhiên), theo mình biết giải thuật này nằm trong cuốn "The C programming language".

          Uniform mang nghĩa dãy phân phối đều, tức là xác suất để các con số xuất hiện trong dãy là như nhau.

          Dãy pseudo-random phụ thuộc vào trạng thái ban đầu (seed), nếu tạo dãy với seed giống nhau thì kết quả lúc nào cũng như nhau.

          Để dãy gần với ngẫu nhiên thì seed cũng phải có tính ngẫu nhiên. Cách dễ nhất để có seed gần với ngẫu nhiên là lấy thời gian hiện tại. Với VDK có thể dùng RTC hoặc timer + các biến đếm để xác định thời gian trôi qua, sau đó tính toán các giá trị này và seed cho pseudo-random generator.
          - Xin đọc trước khi post bài

          Xin đặt code trong thẻ [ code ] [ /code ]

          Comment

          • phamminhtuan
            Super Moderator
            • Feb 2006
            • 150

            #6
            Nguyên văn bởi bien_van_khat View Post
            Đây là giải thuật để tạo ra dãy uniform pseudo-random (tạm dịch: giả ngẫu nhiên), theo mình biết giải thuật này nằm trong cuốn "The C programming language".

            Uniform mang nghĩa dãy phân phối đều, tức là xác suất để các con số xuất hiện trong dãy là như nhau.

            Dãy pseudo-random phụ thuộc vào trạng thái ban đầu (seed), nếu tạo dãy với seed giống nhau thì kết quả lúc nào cũng như nhau.

            Để dãy gần với ngẫu nhiên thì seed cũng phải có tính ngẫu nhiên. Cách dễ nhất để có seed gần với ngẫu nhiên là lấy thời gian hiện tại. Với VDK có thể dùng RTC hoặc timer + các biến đếm để xác định thời gian trôi qua, sau đó tính toán các giá trị này và seed cho pseudo-random generator.
            Cám ơn bác nhé, thế là em biết sử dụng cái hàm rand() trong CCS C rồi
            PHP Code:
            setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
            ...
            srand(get_timer1());
            _rand = rand(); 
            
            Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
            http://www.picvietnam.com/forum/showthread.php?t=1263

            Comment

            • magicskull
              Nhập môn đệ tử
              • Oct 2010
              • 3

              #7
              vậy có ai huynh nào tóm tắt lại giùm em cách tạo 1 số ngẫu nhiên được không
              em đang cần chọn ngẫu nhiên 1 số từ 1 tới 8
              anh chỉ giùm em với em đang cần gấp lắm
              cám ơn nhiều

              Comment

              Working...