Bảng tính Google tạo số ngẫu nhiên với Math.random ()


7

Tôi đang cố gắng viết một hàm script, gọi Javascript Math.random()để tạo một số ngẫu nhiên trong khoảng [0, 1), như sau:

function f() {
  return Math.random();
}

và tôi gọi nó từ một tế bào:

Số ngẫu nhiên

Tuy nhiên, mỗi lần tôi làm mới bảng tính (sử dụng F5hoặc Ctrl+ R), nó sẽ trả về cùng một số.

Lý do tôi không sử dụng RAND()chức năng bảng tính là vì tôi muốn thực hiện một số tính toán phức tạp f(). Tôi đã cố gắng chuyển RAND()như một tham số từ bảng tính và trả về tham số, nhưng trong trường hợp đó, hàm này không bao giờ trả về:

Số ngẫu nhiên 2

Có cách nào để tôi có thể tạo số ngẫu nhiên có thể làm mới từ bên trong hàm không?


Bạn có thể đặt kết quả của = rand () vào một cột của trình trợ giúp và sau đó chuyển nội dung của cột đó vào hàm của bạn không? Điều đó có thể giải quyết hành vi treo bạn đang nhìn thấy.
MaryC.fromNZ

Câu trả lời:


3

Câu trả lời ngắn

Thay vì sử dụng chức năng tùy chỉnh, hãy sử dụng chức năng tích hợp khi có thể hoặc sử dụng chức năng được kích hoạt bởi một sự kiện.

Giải trình

Như OP đã đề cập, Google Sheets có chức năng tích hợp để trả về một số ngẫu nhiên trong khoảng từ 0 đến 1: RAND .

Trong trường hợp bắt buộc phải thực hiện một số tính toán phức tạp không khả thi hoặc hiệu quả với các chức năng tích hợp sẵn, một cách khác là sử dụng Google Apps Script. Cần lưu ý rằng các hàm tùy chỉnh chỉ được tính toán lại khi một trong các đối số của chúng thay đổi, mặt khác các đối số của chúng phải mang tính xác định, do đó, sử dụng các hàm như NOW (), TODAY (), RAND () và RANDBETweEN () sẽ trở lại một lỗi ngay cả khi chúng được lồng trong các chức năng bảng tính khác hoặc được đưa vào gián tiếp thông qua các tham chiếu.

Google Apps Sc Script có hai loại sự kiện, đơn giản và có thể cài đặt. Xem https://developers.google.com/apps-script/guides/triggers/ để biết chi tiết.

Thí dụ

Đoạn mã sau sẽ cập nhật tham chiếu ô duy nhất được chỉ định mỗi lần người dùng chỉnh sửa bảng tính với một số ngẫu nhiên được tạo bởi một Math.random().

tham chiếu var = 'A1';

hàm onEdit (e) {
  Bảng tính ứng dụng
    .getActiveSheet ()
    .getRange (tham khảo)
    .setValue (Math.random ());
}

Người giới thiệu


2

Lưu ý: Câu trả lời này chỉ hợp lệ cho Bảng tính Google cũ. Hiện tại, chức năng không xác định như NOW()không được phép như các đối số của các chức năng tùy chỉnh . Cố gắng làm cho nên kết quả trong thông báo lỗi "Chức năng này không được phép tham chiếu đến một ô có NOW(), RAND()hoặc RANDBETWEEN()" .


Các chức năng trong Google Apps Script được coi là xác định. Vì chức năng tùy chỉnh của bạn không có tham số, nên nó sẽ trả về cùng một kết quả mỗi lần.
Xem Vấn đề 2573: Math.random () không tính toán lại như một công thức bảng tính tùy chỉnh

Để tạo một số ngẫu nhiên mới mỗi lần, bạn sẽ nghĩ rằng nó nên hoạt động để vượt qua dấu thời gian hiện tại dưới dạng tham số:

 =f(now())

Tuy nhiên, chức năng này dường như không bao giờ trở lại. Tôi đoán điều này là do giá trị trả về của các NOW()thay đổi mỗi mili giây và phải mất hơn một phần nghìn giây để thực hiện phép tính.

Vì vậy, bạn sẽ phải giải quyết một cái gì đó không cần cập nhật thường xuyên, như

=f(day(now()))

Điều này sẽ trả về một giá trị ngẫu nhiên mới mỗi ngày trong tháng.

Lưu ý rằng nếu bạn sử dụng công thức này trong nhiều ô, nó sẽ trả về cùng một giá trị ngẫu nhiên cho tất cả các ô. Để tránh điều đó, bạn cũng có thể truyền tọa độ ô hiện tại làm tham số:

=f(day(now()), 2, 4)

Tôi đã thiết lập một bảng tính ví dụ , hãy xem.


Thay vì giới thiệu các tham số mới, bạn có thể may mắn thay đổi cài đặt trong Tệp → Cài đặt bảng tính → Tính toán lại thành Thay đổi và mỗi phút . Ít nhất điều này nên làm việc cho RAND(), xem tài liệu . Hiện tại, điều này mang lại cho tôi một thông báo lỗi, vì vậy tôi không thể biết liệu nó có hoạt động không.


2

Tạo số ngẫu nhiên Bổ trợ có thể giúp tạo số ngẫu nhiên trong bảng tham chiếu của google

nhập mô tả hình ảnh ở đây

Để biết thông tin chi tiết bấm vào đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.