2016-02-09 17 views
6

Tôi đã lập trình trong nhiều năm và vấn đề tôi đang trình bày bây giờ có lẽ là một trong những điều kỳ lạ nhất mà tôi gặp phải.Số ngẫu nhiên gen w/hạt giống hành động không xác định

Có một khối mã trong ứng dụng của tôi mà tạo ra một cách ngẫu nhiên một chuỗi các thẻ, với ba loại có thể, giả sử A, B hoặc C.

Vì vậy, 10 thẻ có thể ABCCAAABAC.

Vào đầu của khối mã, hạt giống bộ tạo số ngẫu nhiên được khởi tạo như sau:

math.randomseed(seed) 
math.random() 

Bây giờ, gì ngạc nhiên khi giá trị hạt giống vẫn không đổi, tôi luôn nhận được cùng một chuỗi các thẻ, bởi vì mã tạo ngẫu nhiên thực thi theo cách xác định. Vâng, hầu như luôn luôn.

Thực ra, trong những dịp hiếm hoi, ngoài màu xanh, tôi sẽ nhận được một chuỗi ngẫu nhiên khác nhau cho cùng một hạt giống. Sau đó, nó trở lại bình thường trước khi tôi biết điều đó. Có thể bạn đang suy nghĩ - ah, các hiệu ứng phụ, đây có thể là vấn đề liên quan đến tiểu bang, theo đó khối mã tạo chuỗi chuỗi mã thông báo ngẫu nhiên sử dụng biến số thay đổi số lần gọi là random() (ví dụ). Tuy nhiên, tôi chắc chắn 99% rằng tôi đã kiểm soát tất cả các tác dụng phụ rõ ràng. Chỉ có một vài nơi trong khối mã truy cập trạng thái bên ngoài, và tất cả chúng đều không đổi.

Cốt truyện dày hơn nữa - vấn đề này chỉ rõ ràng đối với tôi khi triển khai Android của ứng dụng mà tôi đang xây dựng. Phải thừa nhận rằng, đây là một lỗi hiếm gặp, và tôi dường như không thể lặp lại nó một cách đáng tin cậy. Vì vậy, nó cũng có thể có mặt trong triển khai iOS. Nhưng tôi vẫn chưa thấy nó trên các nền tảng khác. Tôi cũng có thể đề cập đến việc tôi đang sử dụng lua scripting thông qua Corona SDK để phát triển ứng dụng.

tôi đã đưa vấn đề này nhiều suy nghĩ, và đã thu hẹp nó xuống đến một vài khả năng:

  1. Tương tác với một thread trong đó sử dụng cùng một bộ tạo số ngẫu nhiên, mà tôi không biết gì về
  2. (Điều này thậm chí có thể trong lua?) Một số loại tham nhũng đống là dẫn đến tác dụng phụ lạ
  3. Tôi đã sai lầm và có một số tài liệu tham khảo rõ ràng damn đến trạng thái bên ngoài mà tôi đã bỏ lỡ trong nhiều giờ gỡ lỗi

Các khía cạnh đau đớn nhất của tất cả điều này là không lặp lại của lỗi. Hầu hết thời gian, khối mã hoạt động hoàn toàn theo định nghĩa cho một hạt giống lặp lại. Sau đó, dường như có một pha không xác định, sau đó sẽ tiêu tan lại sau một khoảng thời gian không xác định. Tôi rất thích chọn bộ não của một chuyên gia ở đây.

Điều gì có thể xảy ra ở đây? Ngoài ra - có thể có bất kỳ nền tảng cụ thể nào đang diễn ra với vấn đề cụ thể này không, vì tôi chỉ thấy nó trên các triển khai Android?

Để tham khảo, dưới đây là toàn bộ mã. Nó thực sự tạo ra các thẻ với hai thuộc tính ngẫu nhiên (một trong ba màu và một trong ba hình dạng), nhưng điều đó không có nghĩa nhiều về bản chất của vấn đề.

math.randomseed(currentRandomSeed) 
math.random() 

local tokenListPlan = {} 

-- randomly assign weighting distribution 
local thresh1, thresh2 
while (true) do 
    local s0 = math.random(1, 99) 
    local s1 = math.random(1, 99) 
    local c0 = s0 
    local c1 = s1 - c0 
    local c2 = 100 - c1 - c0 
    if (c0 >= eng.DEVIATION_THRESHOLD and c1 >= eng.DEVIATION_THRESHOLD and c2 >= eng.DEVIATION_THRESHOLD) then 
     thresh1 = c0 
     thresh2 = c0 + c1 
     break 
    end 
end 

-- generate tokens (deterministic based on seed) 
for i = 1, sortedCountTarget do 
    local token 
    local c = 1 

    local rnd = math.random(1, 100) 
    if (rnd < thresh1) then -- skewed dist 
     c = 1 
    elseif (rnd < thresh2) then 
     c = 2 
    else 
     c = 3 
    end 

    if (paramGameMode == eng.GAME_MODE_COLOR) then 
     local rnd46 = math.random(4, 6) 
     token = {color = c, shape = rnd46} 
    elseif (paramGameMode == eng.GAME_MODE_SHAPE) then 
     local rnd13 = math.random(1, 3) 
     token = {color = rnd13, shape = c + 3} 
    else 
     local rnd13 = math.random(1, 3) 
     local rnd46 = math.random(4, 6) 
     token = {color = rnd13, shape = rnd46} 
    end 

    tokenListPlan[#tokenListPlan + 1] = token 
end 
+0

nơi bạn đặt ngẫu nhiên chính xác? có thể là, trong android, dòng cài đặt ngẫu nhiên được chạy nhiều lần vì bất kỳ lý do gì. – muratgu

+0

Ngay trước khối mã (không có gì ở giữa), tôi sẽ chỉnh sửa bài đăng ít mơ hồ hơn ở đây. Thật không may tôi không thể nhìn thấy bất kỳ cách nào nó có thể được thực hiện nhiều hơn một lần, đặc biệt là không thường xuyên ... –

+2

Trong một số trường hợp math.random cháy nhiều hơn chỉ số tiền dự kiến ​​trong thời gian mã này đang chạy? Hãy thử gói nó vào một chức năng trong đó sử dụng một đóng cửa để đếm số tiền nó được gọi là. Xem liệu nó có thay đổi khi bạn nhận được kết quả khác không. – warspyking

Trả lời

1

https://docs.coronalabs.com/api/library/math/random.html trạng thái:

Chức năng này là một giao diện cho giả ngẫu nhiên đơn giản chức năng máy phát điện rand được cung cấp bởi ANSI C. Không đảm bảo có thể được đưa ra cho các thuộc tính thống kê của nó.

Điều này khiến tôi tự hỏi liệu các chương trình khác có sử dụng cùng chức năng hay không. Điều đó có thể dẫn đến những xung đột đó, trong khi cũng ít nhiều giải thích tại sao đôi khi chúng chỉ xảy ra.

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