4

Javascriptを使用して、分布の一方または他方に偏った乱数を生成するにはどうすればよいですか?または、理想的には範囲内のポイントですか?

コンテキストについて:ランダムな灰色の正方形のグリッドを使用するUIを作成しています。を使用してグレーのRGB値を生成してMath.random()いますが、黒から白までの全範囲を表現したまま、グレーを平均して暗くしたり明るくしたりできるようにしたいと考えています。

(これは、特定の数に向けてJava乱数を生成するのと同様の質問だと思いますが、私はJavascriptを使用しています...)

どんな助けでも大歓迎です。

4

3 に答える 3

11

ガンマ曲線Math.random()を取得するために累乗します-これにより、0と1の間の分布が変更されますが、0と1は一定のエンドポイントのままです。

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

ガンマ>1の場合、出力は暗くなります。0 <gamma <1の場合、明るくなります。(ここで、「2」はxの二乗曲線を示します。等距離の明度は、平方根曲線の場合は「0.5」になります。)

于 2012-07-08T12:57:33.943 に答える
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の答えはやや、えー、もっと優雅です!

于 2012-07-08T13:17:54.997 に答える
1

[これは少し異なるアプローチかもしれません。]

このアプローチでは、次の方法で番号を取得します。

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

どこ:

  • numberToSkewToに偏りたい数です。
  • stdDeviationからの偏差ですnumberToSkewTo
  • numberToSkewTo + abs(stdDeviation) <= MAX_NUMBER
  • numberToSkewTo - abs(stdDeviation) >= 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

}
于 2012-07-08T13:44:19.630 に答える