指定の範囲でランダムな数を生成するカスタム関数

Power Apps

Power Appsでランダムな値を取り出すためには、Rand関数を使用します。

一般的にある範囲のランダムな値を取り出すためには、ランダムな値の余りを使用したり最大値と最小値の差にランダムな値をかけるなどします。

たまにしか使用しないためよく忘れてしまいますので、カスタム関数にしてしまおうと思います。

カスタム関数とは→【早い・美しい・易しい】カスタム関数について

Rand関数とは

Rand 関数は、0 以上 1 未満の疑似乱数を返します。

公式より引用

0~1の間でボタンなどを押す度に値が変化する揮発性関数です。

カスタム関数を作成する

今回は余りを使用してランダムな値を算出する方法を取ります。

Excelにも同様の関数がありますので、RandBetween関数と名付けました。

パラメーターを追加していきます。

パラメーター名説明データ型
Value11つ目のしきい値数値
Value22つ目のしきい値数値
decimalplaces小数点以下の桁数数値
decimalplacesは任意で要求

カスタム関数の中身を作っていきます。どうでもいい方はコピペで大丈夫です。

Mod(Round(Rand()*10^Len(Text(Round(Max(Value1,Value2),0)))
,decimalplaces),Abs(Value1-Value2))+Min(Value1,Value2)

Rand()*10^Len(Text(Round(Max(Value1,Value2),0)))の部分でValue1Value2の大きい方の桁数を取得し、ランダム関数で出力される0~1の数に10の桁数乗して整数の桁数を一致させます。

その外側のRound(~,decimalplaces)では、出てきたランダムな値を指定された小数点以下の桁数で丸めます。

その外側のMod(~,Abs(Value1-Value2))+Min(Value1,Value2)は、Value1とValue2の絶対値で余りを取り、それにValue1とValue2の小さい方の値を足すことで出てきたランダムな値を望み通りの範囲内にします。

遊んでみる

ボタンを追加し、OnSelectに以下のコードを割り当てます。

ForAll( Sequence( 1000 ),  Collect( MyRandomNumbers, 数値操作系.RandBetween(1.5,2.5,3) ) )

ボタンを押すことで1.5~2.5の間で小数点以下の桁数が3桁の数が1000行あるコレクションが作成されます。

きちんと出力されてランダムな数が生成されていることが確認できました。

次に、以前作成したBetween関数というカスタム関数を使用して0.2ずつ範囲を区切りどれくらいの分布で数が存在しているかを見てみます。

参考→【早い・美しい・易しい】カスタム関数について

ラベルを追加し、TextにCountIf(MyRandomNumbers,数値操作系.Between(1.5,Value,1.7))を割り当てます。

同様に0.2ずつ範囲をずらしてしきい値を含むかどうかを指定したものを追加します。

1CountIf(MyRandomNumbers,数値操作系.Between(1.5,Value,1.7,true,false))
2CountIf(MyRandomNumbers,数値操作系.Between(1.7,Value,1.9,false,true))
3CountIf(MyRandomNumbers,数値操作系.Between(1.9,Value,2.1,false,true))
4CountIf(MyRandomNumbers,数値操作系.Between(2.1,Value,2.3,false,true))
5CountIf(MyRandomNumbers,数値操作系.Between(2.3,Value,2.5,true))

ほぼ均等に値が分散していることが確認できました。

最後に

私のように忘れっぽい方はよく使う関数の使い道はメモしておくよりカスタム関数にしてしまった方がよかったりします。

簡単に作れますのでチャレンジしてみてください。

コメント

タイトルとURLをコピーしました