簡體   English   中英

影響Math.random()

[英]Influence Math.random()

我正在尋找一種影響Math.random()的方法。

我有這個函數來生成從最小到最大的數字:

var rand = function(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

有沒有辦法讓它更容易得到一個低和高的數字而不是中間的數字?

例如; rand(0,10)將返回0,1,9,10比其余的更多。

有沒有辦法讓它更容易得到一個低和高的數字而不是中間的數字?

是。 您想要更改生成的數字的分布。

http://en.wikipedia.org/wiki/Random_number_generation#Generation_from_a_probability_distribution

一個簡單的解決方案是生成一個包含100個元素的數組。

在這100個元素中,更頻繁地表示您感興趣的數字。

舉個簡單的例子,假設您想要更頻繁地顯示數字1和數字10,您可以在數組中過多地表示它。 即。 數組中的第一個20次,數組中的數字10次20次,其余數字均勻分布。 然后使用0-100之間的隨機數作為數組索引。 這將增加你獲得1或10的概率與其他數字相比。

你需要一個分布圖。 從隨機輸出[0,1]映射到您期望的分布結果。 如[0,.3]將產生0,[。3,.5]將產生1,依此類推。

當然。 目前還不完全清楚你是否想要一個平滑的滾降,所以(例如)2和8的返回頻率通常超過5或6,但一般的想法無論哪種方式都有效。

這樣做的典型方法是生成比輸出更大的數字范圍。 例如,讓我們從5開始,作為以頻率N出現的基線。假設您希望4或7頻率為2N,3或8,頻率為3N,2或9,頻率為4N,0或10頻率為5N 。

添加它們,我們需要來自生成器的1到29(或0到28,或其他)的值。 前5個中的任何一個給出0的輸出。接下來的4中的任何一個給出和輸出1.接下來的3中的任何一個給出2的輸出,依此類推。

當然,這不會改變原始生成器返回的值 - 它只是讓我們編寫一個我們自己的生成器,它根據我們選擇的分布生成數字。

並不是的。 存在基於種子生成的一系列數字。 你的隨機數來自序列。 當你隨機調用時,你正在抓住序列的下一個元素。

你可以在javascript(運行客戶端)中影響Math.random的輸出嗎?

不,至少不是以任何可行/實際的方式。

但是你可以做的是創建自己的隨機數生成器,在你需要的發行版中產生數字。

可能有無數種方法,你可能想要考慮概率函數的確切形狀/曲率。

它可能可以在一行中完成,但這是一個使用現有函數定義的多行方法(在這里命名為rand ):

var dd = rand(1,5) + rand(0,5);
var result;
if (dd > 5)
    result = dd - 5;
else result = 6 - dd;

一個基本結果是,如果U是具有均勻分布的隨機變量,而F是要從中采樣的累積分布,則Y = G(X)其中G是F的倒數,其中F為其累積分布。 這可能不一定是最有效的方法,並且從所有類型的分布中生成隨機數本身就是一個研究子域。 但是對於一個簡單的轉換,它可能就是這樣做的。 與你的情況類似,F(x)可以是4 *(x-.5)^ 3 + .5,它似乎滿足所有約束並且易於反轉並用作基本隨機數發生器的變換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM