Tốc độ xử lý hàm rand

Excel cho Microsoft 365 Excel cho Microsoft 365 dành cho máy Mac Excel cho web Excel 2021 Excel 2021 for Mac Excel 2019 Excel 2019 for Mac Excel 2016 Excel 2016 for Mac Excel 2013 Excel 2010 Excel 2007 Excel for Mac 2011 Excel Starter 2010 Xem thêm...Ít hơn

Bài viết này mô tả cú pháp công thức và cách dùng hàm RAND trong Microsoft Excel.

Mô tả

Hàm RAND trả về một số thực ngẫu nhiên được phân bố đều, lớn hơn hoặc bằng 0 và nhỏ hơn 1. Một số thực ngẫu nhiên mới được trả về mỗi khi trang tính được tính toán.

Cú pháp

RAND()

Cú pháp hàm RAND không có đối số nào.

Chú thích

  • Để tạo một số thực ngẫu nhiên nằm giữa a và b, hãy dùng:

=RAND()*(b-a)+a

  • Nếu bạn muốn dùng hàm RAND để tạo một số ngẫu nhiên nhưng không muốn các số thay đổi mỗi khi ô được tính toán, bạn có thể nhập =RAND() vào thanh công thức, rồi nhấn F9 để thay đổi công thức thành số ngẫu nhiên. Công thức sẽ tính toán và chỉ trả về một giá trị.

Ví dụ

Sao chép dữ liệu của ví dụ trong bảng sau đây và dán vào ô A1 của một trang tính Excel mới. Để công thức hiển thị kết quả, hãy chọn công thức, nhấn F2 rồi nhấn Enter. Bạn có thể điều chỉnh độ rộng cột để xem tất cả dữ liệu, nếu cần.

Công thức

Mô tả

Kết quả

=RAND()

Số ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn 1

biến đổi

=RAND()*100

Số ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn 100

biến đổi

=INT(RAND()*100)

Số nguyên ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn 100

biến đổi

Lưu ý: Khi trang tính được tính toán lại bằng cách nhập công thức hay dữ liệu vào một ô khác hoặc bằng cách tính toán lại thủ công (nhấn F9), một số ngẫu nhiên mới sẽ được tạo ra cho mọi công thức sử dụng hàm RAND.

Bạn cần thêm trợ giúp?

Bạn luôn có thể hỏi một chuyên gia trong Cộng đồng Kỹ thuật Excel hoặc nhận sự hỗ trợ trongCộng đồng trả lời.

Xem thêm

Giải thuật Mersenne Twister

RANDBETWEEN (Hàm RANDBETWEEN)

Cần thêm trợ giúp?

  • #1

MÌnh lấy tạm 1 VD như sau:
-Mình cần lập 1 bảng số liêu về Thời gian học và Thời gian chơi của 100 người trong 1 tuần(168h)( học +chơi có thể bằng 168h)
-Mình định dùng hàm RAND() trong khoảng 0-168 cho 2 cột Học và Chơi nhưng Làm thế nào để sau khi lấy tổng lại không vượt quá 168
Thanks mọi người

Tốc độ xử lý hàm rand

  • #2

MÌnh lấy tạm 1 VD như sau:
-Mình cần lập 1 bảng số liêu về Thời gian học và Thời gian chơi của 100 người trong 1 tuần(168h)( học +chơi có thể bằng 168h)
-Mình định dùng hàm RAND() trong khoảng 0-168 cho 2 cột Học và Chơi nhưng Làm thế nào để sau khi lấy tổng lại không vượt quá 168
Thanks mọi người

Tốc độ xử lý hàm rand

Mình cao có 1,65 mét hè, hổng phải cao nhân, bạn thử cái này xem sao
Nói "dzui" thôi nhé, đừng giận

  • ngau nhien.xls

    45 KB · Đọc: 214

  • #3

Mình cao có 1,65 mét hè, hổng phải cao nhân, bạn thử cái này xem sao
Nói "dzui" thôi nhé, đừng giận

Nếu ko phải là 2 cột mà tổng của 4 cột thì mình chỉ cần thêm :
Cột 3=thu(168-A1-B1)
Cột 4 =thu(168-A1-B1-C1)
đúng không bác

Lần chỉnh sửa cuối: 2/4/10

  • #4

Mình không hiểu về hàm Rand lắm. Bạn có thể cho mình biết ý nghĩa của nó được không.
Ví dụ của bạn là như thế nào?
Thân!

Hàm rand() trả về giá trị là một số thực ngẫu nhiên tứ 0 đến 1, trong đề bài muốn xuất hiện số ngẫu nhiên từ 0 đến 168 nên trong công thức mình chỉ lấy phần nguyên của số thực ngẫu nhiên từ 0 đến 1 * 168
- To MDmen:
Riêng vấn đề của bạn đặt ra mình thấy có mâu thuẫn: cột thứ nhất lấy số ngẫu nhiên tư 0 đến 168, cột thứ hai cũng vậy mà tổng 2 cột không được lớn hơn 168 thì hơi bị ...vô lý, nên mình chỉ cho cột thứ hai là một số ngẫu nhiên trong khoảng 168 - số ngẫu nhiên của cột thứ nhất. Còn cột thứ 3, thứ 4 .. bạn thử là biết liền chứ gì
Thân

Tốc độ xử lý hàm rand

  • #5

Con cò già có nhận thấy rằng tổng của 2 cột đạt yêu cầu không vượt quá 168, nhưng không bao giờ đạt đúng 168 không?
167 là tối đa hà cò ơi. Thiếu 1 tí tôm tép rồi.
________________

Bên công thức thôi, bên VBA thì đúng.

Lần chỉnh sửa cuối: 2/4/10

Tốc độ xử lý hàm rand

  • #6

Hàm rand() trả về giá trị là một số thực ngẫu nhiên tứ 0 đến 1, trong đề bài muốn xuất hiện số ngẫu nhiên từ 0 đến 168 nên trong công thức mình chỉ lấy phần nguyên của số thực ngẫu nhiên từ 0 đến 1 * 168

Có chút sai lầm anh à!
Hàm RAND() trả về

giá trị là số thực từ 0 đến nhỏ hơn 1

Vì vậy, nếu anh muốn tạo số ngẫu nhiên từ 0 đến 168 thì công thức phải là:
=INT(RAND()*169)

Tổng quát

: Để tạo số nguyên ngẫu nhiên từ a đến b (a < b) thì công thức sẽ là:
=INT(RAND()*(b - a + 1)) + a

  • #7

Có chút sai lầm anh à!
Hàm RAND() trả về

giá trị là số thực từ 0 đến nhỏ hơn 1

Vì vậy, nếu anh muốn tạo số ngẫu nhiên từ 0 đến 168 thì công thức phải là:
=INT(RAND()*169)

Tổng quát

: Để tạo số nguyên ngẫu nhiên từ a đến b (a < b) thì công thức sẽ là:
=INT(RAND()*(b - a + 1)) + a

Cám ơn 2 Thầy Ptm và Ndu, mình sử dụng từ chưa chuẩn, đúng ra phải nói là : kết quả trả về là số ngẫu nhiên nằm ở khoảng giữa 0 và 1
Trong cái hàm tự tạo mình đã cộng 1 vào nó "zồi" để nó có thể ra kết quả tối đa là 168, nhưng nghĩ lại rủi ngẫu nhiên "thằng" cột 1 nó ra 168 thì cột 2 nó ra cái chi chi, lại sai yêu cầu của bài nên khi dùng công thức mình chỉ cho nó tới 167 thôi là lý do như vậy
Làm như Thầy Ndu là đúng rồi, mình nghĩ chưa tới cái đó, cột 1 mà 168 thì cột 2 bằng 0 cũng đúng đề bài
Qua cái bài ngẫu nhiêu này, ngẫu nhiên học được thêm vài cái ngẫu nhiên
Hôm nào phải cụng "zí" Thầy Ptm một phát

  • #8

Thanks các bác.Mình làm tổng của 4 cột rồi dựa trên hàm =thu của bác concogia .Nhưng mà cột tổng thì phải đến trên 90% là ra gần 168(toàn 16x với 15x) Như thế chưa ngẫu nhiên cho lắm.Các bác xem có cách nào xử lý cái này không nhỉ

Tốc độ xử lý hàm rand

  • #9

cột tổng thì phải đến trên 90% là ra gần 168

phải đến 90% là bạn muốn trên 90%, hay bạn muốn rải đều từ 1x đến 15x?
Muốn chia bớt xuống dưới thì nhân thêm 1 lần Rand() nữa.

nghía qua cái hàm RandBetween 1 cái nữa nha.

Còn muốn 100% có tổng 168 thì dễ òm à. Cột cuối lấy 168 trừ mấy số kia cộng lại, 1 phát ra ngay.

  • Random 2 l_n.rar

    15.2 KB · Đọc: 64

Lần chỉnh sửa cuối: 3/4/10

  • #10

phải đến 90% là bạn muốn trên 90%, hay bạn muốn rải đều từ 1x đến 15x?
Muốn chia bớt xuống dưới thì nhân thêm 1 lần Rand() nữa.

nghía qua cái hàm RandBetween 1 cái nữa nha.

Còn muốn 100% có tổng 168 thì dễ òm à. Cột cuối lấy 168 trừ mấy số kia cộng lại, 1 phát ra ngay.

Thanks bác mình muốn nó rải đều từ 1x đến 168 .Đang nghiên cứu cái file của bác

Tốc độ xử lý hàm rand
.Phần RandBetween bị lỗi bác ah.Còn phân kia mình nhận thấy Tổng càng thấp đi thì số người càng ít.
Tốc độ xử lý hàm rand

VD :150-168 :20
141-150:18
131-140:16
................
thế là sao bác nhỉ

Lần chỉnh sửa cuối: 3/4/10

Tốc độ xử lý hàm rand

  • #11

.Phần RandBetween bị lỗi bác ah

Bạn vào menu Tools\Add-Ins và check vào mục Analysis ToolPak thì mới xài được hàm RANDBETWEEN

Tốc độ xử lý hàm rand

  • #12

Còn phân kia mình nhận thấy Tổng càng thấp đi thì số người càng ít.

Thống kê 100 người thì hơi ít để có thể kết luận.
Tuy vậy có thể tăng số người trong mức tổng thấp lên bằng cách dựa vào nguyên lý tăng rất chậm của hàm luỹ thừa trong phạm vi (0, 0.5) và tăng nhanh hơn trong khoảng (0.5, 1). Số mũ càng lớn, sự khác biệt càng nhiều.

Tốc độ xử lý hàm rand

K2=INT(RAND()^5*(169-SUM($J2:J2)))

Fill Right to N2, then Fill Down

See attached file.

  • Rand5lần.rar

    19.5 KB · Đọc: 9

Lần chỉnh sửa cuối: 3/4/10

Tốc độ xử lý hàm rand

  • #13

Thống kê 100 người thì hơi ít để có thể kết luận.
Tuy vậy có thể tăng số người trong mức tổng thấp lên bằng cách dựa vào nguyên lý tăng rất chậm của hàm số mũ trong phạm vi (0, 0.5) và tăng nhanh hơn trong khoảng (0.5, 1). Số mũ càng lớn, sự khác biệt càng nhiều.

View attachment 43904

K2=INT(RAND()^5*(169-SUM($J2:J2)))

Fill Right to N2, then Fill Down

See attached file.

Vẫn có cảm giác cột đầu tiên được ưu tiên hơn sư phụ à!
Em nghĩ dùng VBA sẽ hay hơn! Bằng cách gán giá trị ngẫu nhiên vào 1 cell ngẫu nhiên ---> Như vậy mức ưu tiên sẽ chia đều cho 4 cell

Tốc độ xử lý hàm rand

  • #14

Em đề xuất code này, bảo đảm mức ưu tiên sẽ chia đều cho các cell (trong 1 hàng)

PHP:

Sub CreateRandomNum()
  Dim i As Long, j As Long, Tmp1 As Long, Tmp2 As Long
  With CreateObject("Scripting.Dictionary")
    For i = 1 To 100
      Tmp1 = 0: Tmp2 = 0: .RemoveAll
      Do
        Randomize
        j = Int(Rnd() * 4) + 1
        If Not .Exists(j) Then
          Tmp1 = Int(Rnd() * (169 - Tmp2))
          Tmp2 = Tmp2 + Tmp1
          .Add j, Tmp1
          Range("A2")(i, j) = Tmp1
        End If
      Loop Until .Count = 4
    Next i
  End With
End Sub

  • CreateRandomNum.xls

    25.5 KB · Đọc: 15

Tốc độ xử lý hàm rand

  • #15

Vẫn có cảm giác cột đầu tiên được ưu tiên hơn sư phụ à!

Công thức Rand()^5 nhằm giải quyết việc anh Bill ưu tiên các số tổng lớn hơn 150 mà ndu! Nghĩa là với 4 cột thì xác suất cả 4 số đều nhỏ (để cho tổng số nhỏ) là rất thấp so với xác suất để cho cả 4 ô đều lớn (để cho tổng số lớn). Nghĩa là trong trường hợp này phân bố ngẫu nhiên không đồng đều.
Việc luỹ thừa Rand() lên nhằm phân bố không đồng đều ngược lại để bù vào.

Còn biện pháp của ndu là nhằm cải thiện việc phân bố theo cột: Hiển nhiên là cột nào tính trước sẽ ưu tiên hơn nhưng không thoát ra ngoài cái "phân bố ngẫu nhiên không đồng đều" nói trên.

Để xét sự phân bố theo khoảng từ 0 đến 1 của Rand(), anh đã có cột count() để kiểm tra.
Để xét sự phân bô theo cột, ta tính tổng từng cột để kiểm tra (xem file).

Kết quả:
Cách của anh thì giải quyết vấn đề 1, vấn đề 2 vẫn còn.
Cách của ndu giải quyết vấn đề 2, vấn đề 1 còn nguyên, ý tác giả muốn phân bố tổng đều từ 1x đến 16x cơ.

Vậy kết hợp 2 cách, dùng VBA của ndu, chỉ thêm đúng 2 ký tự "^5" vào, sẽ thấy sự khác biệt.
Lý do ^5 mà không phải số khác: Đã test tăng dần từ 2 lên, tới 5 là đạt yêu cầu. Test theo nguyên lý đã nói ở bài trên.

Lạ 1 điều là VBA chạy chậm hơn công thức.

Xem trong file, với các ô kiểm tra ở sheet "2 cách" sẽ so sánh được hơn và kém trong việc giải quyết 2 vấn đề, mỗi cách chỉ giải quyết 1.

Sheet "1 cách kết hợp" là gần như tối ưu.

  • CreateRandomNum2.rar

    24.9 KB · Đọc: 23

Lần chỉnh sửa cuối: 4/4/10

Tốc độ xử lý hàm rand

  • #16

Lạ 1 điều là VBA chạy chậm hơn công thức.

Xem trong file, với các ô kiểm tra ở sheet "2 cách" sẽ so sánh được hơn và kém trong việc giải quyết 2 vấn đề, mỗi cách chỉ giải quyết 1.

Sheet "1 cách kết hợp" là gần như tối ưu.

Gán giá trị cho từng cell, đương nhiên tốc độ sẽ chậm
Sư phụ sửa code thành vầy:

PHP:

Sub CreateRandomNum2()
  Dim i As Long, j As Long, Tmp1 As Long, Tmp2 As Long, Arr, TG
  TG = Timer
  ReDim Arr(199, 3)
  With CreateObject("Scripting.Dictionary")
    For i = 0 To 199
      Tmp1 = 0: Tmp2 = 0: .RemoveAll
      Do
        Randomize
        j = Int(Rnd() * 4)
        If Not .Exists(j) Then
          Tmp1 = Int(Rnd() ^ 5 * (169 - Tmp2))
          Tmp2 = Tmp2 + Tmp1
          .Add j, Tmp1
          Arr(i, j) = Tmp1
        End If
      Loop Until .Count = 4
    Next i
  End With
  Range("A2:D201").Value = Arr
  MsgBox Timer - TG
End Sub

Nó sẽ chạy... như điên

  • #17

cho em hỏi thêm về vấn đề này:
Nếu e cần lấy số RAND() cho 8 số hạng (là tỉ trọng danh mục) với điều kiện như sau:
- Từng số hạng lấy RAND() đều có Min vs Max có thể thay đổi đc theo ý ng sử dụng;
- Tổng RAND() của 8 số hạng ko vượt 100% (vì đây là tỉ trọng);
Các pp trên đưa ra đều thõa yêu cầu là lấy số ngẫu nhiên không vượt 100% nhưng chưa thõa đc đk từng tỉ trọng có Min và Max riêng nên e đang chưa biết xử lý ntn.
Nhờ các anh/chị giúp đỡ, em xin cảm ơn!

  • Rand-weight.xlsx

    10.4 KB · Đọc: 2