0

Node.js を使用して、1 から 100 の間の乱数を生成する方法を考え出そうとしています。しかし、典型的な RAND() 関数のような標準的な線形分布を使用する代わりに、代わりにワイブル (またはたとえば、75 から 100 の値は 80% の確率で生成され、50 から 74 の値は 15% の確率で生成されます。時間、および残り (< 20) は時間の 5% を生成しました。

次の式 alpha*(-ln(1-X))^(1/beta) を使用してワイブル確率変数関数を見つけました。X が 0 から 1 までの標準的な線形ランダムであると仮定すると、アルファ = 1 を使用し、ベータ <= 1 は適切な分布を与えるように見えますが、常に 1 と100。

アイデアや推奨事項は大歓迎です。

4

1 に答える 1

3

わかりました-誰かが私のバージョンの回答に興味を持っている場合に備えて。次のリファレンスを使用することで、ワイブルの結果セットを制約するという目標を達成できました。

https://stats.stackexchange.com/questions/30303/how-to-simulate-data-that-satisfy-specific-constraints- such-as-having-specific-m

次のリンクも便利でした。

http://en.wikipedia.org/wiki/Weibull_distribution

http://mathworld.wolfram.com/WeibullDistribution.html

最終的に、node,js コードで荒削りにされたコードは次のようになります。

var desiredMin = 1; //the desired minimum random result 
var desiredMax = 50; //the desired maximum random result 
var scale = 1; //Weibul scale parameter (1 provides an inverse result set)
var shape = 10; //Weibul shape parameter (how skewed the result set is)

//given an possible random range of {0,1} value calculate the minimum and maximum Weibull distribution values given current shape and scale parameters
var weibullMin = Math.pow((shape*scale), (-1*shape)) * Math.pow(.000001, shape -1) * Math.exp(Math.pow((.000001/scale), shape));
var weibullMax = Math.pow((shape*scale), (-1*shape)) * Math.pow(.999999, shape -1) * Math.exp(Math.pow((.999999/scale), shape));

//simulate 1000 random weibull values and write results to file
fileStream.once('open', function(fd) {
    for(var i = 1; i <= 1000; i++) {
        var r = Math.random();
        var weibullRandom = Math.pow((shape*scale), (-1*shape)) * Math.pow(r, shape-1) * Math.exp(Math.pow((r/scale), shape)); //generate Weibull random value
        var weibullRandomAdjusted = desiredMin + (desiredMax - desiredMin)*((weibullRandom-weibullMin) / (weibullMax - weibullMin)); //adjust Weibull random value so that it constrained into the desired min/max range
        fileStream.write(weibullRandomAdjusted + "\n");
    };
    fileStream.end();
});

さまざまな「形状」値のコードを実行しましたが、必要な結果が正確に得られます。

于 2014-02-21T15:45:57.950 に答える