【问题标题】:How to generate skewed random numbers in Javascript?如何在Javascript中生成倾斜的随机数?
【发布时间】:2012-07-08 12:42:01
【问题描述】:

使用 Javascript,我如何生成偏向分布的一端或另一端的随机数?或者理想情况下是范围内的一个点?

对于上下文:我正在创建一个使用随机灰色方块网格的 UI。我正在使用Math.random() 生成灰色的 RGB 值,但希望能够使灰色平均变暗或变亮,同时仍然表示从黑色到白色的全范围。

(我认为这是与Skewing java random number generation toward a certain number 类似的问题,但我正在使用 Javascript...)

非常感谢任何帮助。

【问题讨论】:

  • 你必须在你想要的任何分布背后实现数学。所有 JavaScript 的运行时都会为您提供均匀分布的伪随机数。

标签: javascript math random


【解决方案1】:

Math.random() 提高到一个幂以获得gamma curve - 这会改变 0 和 1 之间的分布,但 0 和 1 保持不变的端点。

var r= Math.pow(Math.random(), 2);
var colour= 'rgb('+r*255+', '+r*255+', '+r*255+')';

对于 gamma>1,您将获得更暗的输出;对于 0

【讨论】:

  • +1 还有其他可能的分布,但伽马是一个不错的选择,因为问题说这些代表亮度值。
  • 谢谢。这给了我想要的视觉效果(还有一些其他的调整)。代码也很简单。
【解决方案2】:

这似乎比@bobince 的回答有点粗鲁,也不那么优雅,但到底是什么。

//setup
var colours = [], num_colours = 10, skew_to = 255, skew_chance = 20;

//get as many RGB vals as required
for (var i=0; i<num_colours; i++) {

    //generate random grey
    var this_grey = Math.floor(Math.random() * 256);

    //skew it towards the @skew_to endpoint, or leave as-is?
    if (Math.floor(Math.random() * 100) >= skew_chance && this_grey != skew_to) {

            //skew by random amount (0 - difference between curr val and endpoint)
        var skew_amount = Math.floor(Math.random() * Math.abs(this_grey - skew_to));
        this_grey += ' (skewed to '+(skew_to < this_grey ? this_grey - skew_amount : this_grey + skew_amount)+')';
    }
    colours.push(this_grey);
}
console.log(colours);

基本上它会生成随机灰色,然后根据skew_chance 中可能指定的(百分比)决定是否倾斜它。 (如果你想让这个偶尔,而不是恒定的)。如果它决定倾斜,然后从灰度值中添加或减去一个随机数(取决于倾斜端点是低于还是高于当前值)。

这个随机数是一个介于 0 和当前值与端点的绝对差之间的数字,例如如果当前值为 40,端点为 100,则添加的数字将在 0 到 60 之间。

就像我说的,@bobince 的回答有点,呃,更优雅!

【讨论】:

    【解决方案3】:

    [这可能有点不同。]

    这种方法处理以下列方式获取数字:

    random = numberToSkewTo + random(-1,1)*stdDeviation
    

    地点:

    • numberToSkewTo 是您想要倾斜的数字。
    • stdDeviation 是与numberToSkewTo 的偏差
    • numberToSkewTo + abs(stdDeviation) &lt;= MAX_NUMBER
    • numberToSkewTo - abs(stdDeviation) &gt;= MIN_NUMBER

    以下代码的作用是,它在给定数字周围选择一个随机数,标准差不断增加。它返回结果的平均值。

    function skew(skewTo,stdDev){
        var rand = (Math.random()*2 - 1) + (Math.random()*2 - 1) + (Math.random()*2 - 1);
        return skewTo + rand*stdDev;
    }
    
    function getRandom(skewTo){
        var difference = Math.min(skewTo-MIN_NUMBER, MAX_NUMBER-skewTo);
        var steps = 5;
        var total = 0.0;
        for(var i=1; i<=steps; i++)
            total += skew(skewTo, 1.0*i*difference/steps);
        return total/steps
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 2011-05-10
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2015-09-27
      相关资源
      最近更新 更多