ホームページ > バックエンド開発 > PHPチュートリアル > 数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか?

数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか?

WBOY
リリース: 2016-06-17 08:31:03
オリジナル
1184 人が閲覧しました

比如:生成一个随机值 rand (范围是 1-100)。rand中出现小的值概率很高,但大的值的概率很低。希望大神给一个具体的公式。随机值用rand替代就行。最好可以用代码实现,比如PHP Python等,谢谢!
ログイン後にコピー

返信内容:

累積分布関数 (CDF) 数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか? が与えられると、その逆関数 数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか? が見つかる限り、一様分布乱数 Y in [0,1]数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか? にマッピングできます。これを逆変換サンプリングと呼びます。 ランダム サンプリング (numpy.random)

numpy.random は、
などの定義された分布
<code class="language-text">beta(a, b[, size])	Draw samples from a Beta distribution.
binomial(n, p[, size])	Draw samples from a binomial distribution.
chisquare(df[, size])	Draw samples from a chi-square distribution.
dirichlet(alpha[, size])	Draw samples from the Dirichlet distribution.
exponential([scale, size])	Draw samples from an exponential distribution.
f(dfnum, dfden[, size])	Draw samples from an F distribution.
gamma(shape[, scale, size])	Draw samples from a Gamma distribution.
geometric(p[, size])	Draw samples from the geometric distribution.
gumbel([loc, scale, size])	Draw samples from a Gumbel distribution.
</code>
ログイン後にコピー
からサンプリングする関数を実装しました。 投稿者が 1 から 100 までの整数を取ると仮定します。100 の確率は 99 の 2 倍、99 は 98 の 2 倍です。
次に、1 に基づいて、
合計 SUM = 1+2 + 4 + 2^ 99 =2^100-1
次に、rand(1,SUM) が 2^30-1 から 2^31 の間にある場合、30 が取得されます。簡単な式は log(rand(1,SUM))/log2 です。 あなたの醜さを見せてください、間違いがあれば指摘してください!


デザインを仕上げているときに偶然この問題に遭遇したので、それを共有したいと思います。

各値の確率を求め、各値の確率を累積し、それぞれの累積結果を数値軸に置くとします。以下に示すように、問題を説明するために 10 個の値を取り上げます。
数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか?


[i] は i 番目の値を表します。横軸 (0 ~ 0.1) は [1] の確率を表し、(0.5 ~ 0.75) は [7] の確率を表し、(0 ~ 0.75) は [1] から [7] までの確率の累積和を表します。

次に、たとえば matlab で rand() 関数を使用して、0 ~ 1 の範囲の一様分布乱数を生成します。画像内で生成された数値が (0.5 の範囲内にある) 0.65 であるとします。 -0.75 ) この区間は [7] の確率を表します。したがって、この確率スクリーニングの結果として [7] を取り出すことにしました。

MATLAB コードを添付します

%max_column 値の数、prob は各
% 値の確率を表し、prob_array は確率の累積和を表します
%largest_cumulative_prob は、最大累積確率値

for j=1:max_column -1
prob_array(j+1) = prob_array(j)+prob(j);
end

largest_cumulative_prob= prob_array(max_column );
%largest_cumulative_prob と prob_array は
% 正規化する必要がありますが、コード

choice = rand() * biggest_cumulative_prob;

low = では行われません。 1;
high = max_column;
while (high>(low+1))
middle = (high+low)/2;
middle = Floor(middle);
if ( Choice > prob_array(middle))
low = middle;
else high = middle;

end
end
%このスクリーニングの結果、最終的に low が取り出されます。
%ここでは説明はありません。考え方は上の図と同じです。

この方法は、連続した数値を扱う方法がわかりません。密度を使用してもよいでしょうか?神様が答えてくださることを願っています! 選択方法。
数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか?計算回数は気にしないでください:
数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか? ndndsim のソースコードを少し読みました。 zipf 分布を生成する方法は非常に興味深いです。というテーマの参考になれば幸いです。累積分布関数と、たとえば 1 ~ 50 の範囲が与えられるとします。累積分布関数が計算され、1 から 50 までの関数値が配列に格納されます。次に、一様分布を使用して乱数を生成します。次に、それを 50 個の分布関数値と順番に比較します。添字を返します。もちろん、添え字を返すポイントは要件によって異なります。 数式を探しています: 制御可能な分布を持つ乱数を生成する必要がありますか? 100/ランド(1,100) rand(1,rand(1,rand(1,100))) これはうまくいくと思いますか?
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート