Populate ユーティリティの使用
InterSystems IRIS® データ・プラットフォームは、ここで説明するように、永続クラスで使用する擬似ランダム・テスト・データを作成するユーティリティを備えています。
そのようなデータの作成は、データ生成として知られています。このユーティリティは InterSystems IRIS Populate ユーティリティとして知られ、実際のアプリケーションに永続クラスを配置する前に、永続クラスをテストするのに非常に便利です。特に、大量のデータを扱っているときに、アプリケーションのさまざまな部分がどのように機能するかをテストする場合に役立ちます。
Populate ユーティリティは、InterSystems IRIS クラス・ライブラリの一部である、主要な %PopulateOpens in a new tab クラスからその名前を取っています。%PopulateOpens in a new tab から継承したクラスには、有効なデータを持つクラス・インスタンスの生成と保存に使用できる Populate() メソッドがあります。また、必要に応じたデータを提供するように、%PopulateOpens in a new tab クラスの動作をカスタマイズすることもできます。
%PopulateOpens in a new tab クラスと共に、Populate ユーティリティは %PopulateUtilsOpens in a new tab を使用します。%PopulateOpens in a new tab は、ユーティリティへの継承を提供し、%PopulateUtilsOpens in a new tab はヘルパー・クラスです。
Samples-Data サンプル (https://github.com/intersystems/Samples-DataOpens in a new tab) では Populate ユーティリティが使用されています。(例えば) SAMPLES という名前の専用ネームスペースを作成し、そのネームスペースにサンプルをロードすることをお勧めします。一般的な手順は、"InterSystems IRIS で使用するサンプルのダウンロード" を参照してください。
データ生成の基本
Populate ユーティリティを使用するには、以下の操作を実行します。
-
データを生成する永続クラスごと、および各シリアル・クラスごとに変更を加えます。具体的には、スーパークラスのリストの末尾に %PopulateOpens in a new tab を追加して、クラスがインタフェース・メソッドを継承するようにします。例えば、クラスが直接 %PersistentOpens in a new tab を継承する場合、その新規のスーパークラスのリストは、以下のようになります。
Class MyApp.MyClass Extends (%Persistent,%Populate) {}
%PopulateOpens in a new tab をプライマリ・スーパークラスとして使用しないでください。つまり、スーパークラスのリスト内で最初のクラスとしてリストしないでください。
-
このようなクラスでは、各プロパティの POPSPEC パラメータと POPORDER パラメータを必要に応じて指定して、Populate ユーティリティが、それらのプロパティにデータを生成する方法を制御します (既定のデータではなく、カスタム・データを生成する必要がある場合)。これについては、次のセクションを参照してください。
-
クラスをリコンパイルします。
-
データを生成するには、それぞれの永続クラスの Populate() メソッドを呼び出します。既定では、このメソッドは、クラスごとに 10 個のレコードを生成します (クラスが参照するシリアル・オブジェクトを含む)。
Do ##class(MyApp.MyClass).Populate()
作成するオブジェクトの数を指定することもできます。
Do ##class(MyApp.MyClass).Populate(num)
num は希望するオブジェクトの数です。
これは、手動で各クラスにレコードを追加する場合と同じ順序で実行します。つまり、Class A に Class B を参照するプロパティがある場合は、以下のテーブルを使用して、最初にデータを生成するクラスを判断します。
Class A のプロパティの形式 Class B の継承元 最初にデータ生成するクラス 以下のいずれかの形式 : -
Property PropertyName as ClassB;
-
Property PropertyName as List of ClassB;
-
Property PropertyName as Array of ClassB;
%SerialObjectOpens in a new tab ClassA (これにより、自動的に ClassB にデータを生成する) 以下のいずれかの形式 : -
Property PropertyName as ClassB;
-
Property PropertyName as List of ClassB;
-
Property PropertyName as Array of ClassB;
%PersistentOpens in a new tab ClassB 以下のいずれかの形式 : -
Relationship PropertyName as ClassB [ Cardinality = one ...];
-
Relationship PropertyName as ClassB [ Cardinality = parent ...];
%SerialObjectOpens in a new tab または %PersistentOpens in a new tab ClassB 以下のいずれかの形式 : -
Relationship PropertyName as ClassB [ Cardinality = many...];
-
Relationship PropertyName as ClassB [ Cardinality = child ...];
%SerialObjectOpens in a new tab または %PersistentOpens in a new tab ClassA -
生成されたデータを削除するときには、永続インタフェースの %DeleteExtent() メソッド (安全性を重視)、または %KillExtent() メソッド (速度を重視) を使用します。詳細は、"保存したオブジェクトの削除" を参照してください。
実際には、多くの場合、コードを変更するたびに、繰り返してクラスにデータを生成することが必要になります。そのため、正しい順序でクラスにデータを生成するメソッドまたはルーチンと、生成したデータを削除するメソッドまたはルーチンを作成しておくと作業に役立ちます。
Populate() の詳細
正式には、Populate() クラス・メソッドのシグニチャは以下のようになります。
classmethod Populate(count As %Integer = 10,
verbose As %Integer = 0,
DeferIndices As %Integer = 1,
ByRef objects As %Integer = 0,
tune As %Integer = 1,
deterministic As %Integer = 0) as %Integer
以下はその説明です。
-
count は、作成する予定のオブジェクト数です。
-
verbose では、進行状況メッセージを現在のデバイスに出力するかどうかを指定します。
-
DeferIndices では、データの生成後にインデックスを並べ替える (True) か、データの生成中に並べ替えるかを指定します。
-
objects は、生成されたオブジェクトを格納する参照渡しの配列です。
-
tune では、データの生成後に $SYSTEM.SQL.TuneTable() を実行するかどうかを指定します。これが 0 の場合、このメソッドは $SYSTEM.SQL.TuneTable() を実行しません。これが 1 (既定) の場合、メソッドは、このテーブルに対して $SYSTEM.SQL.TuneTable() を実行します。これが 1 より大きい値の場合、メソッドは、このテーブルと、このクラスの永続スーパークラスによって投影されたテーブルに、$SYSTEM.SQL.TuneTable() を実行します。
-
deterministic は、メソッドを呼び出すたびに同じデータを生成するかどうかを指定します。既定では、メソッドを呼び出すたびに異なるデータが生成されます。
Populate() は、実際にデータを生成したオブジェクトの数を返します。
Set objs = ##class(MyApp.MyClass).Populate(100)
// objs is set to the number of objects created.
// objs will be less than or equal to 100
最小長や最大長などの定義された制約の場合、生成されたデータの一部には検証に合格しないものもあるので、個別のオブジェクトは保存されません。この場合、Populate() は、指定されたオブジェクト数よりも少ない数を作成します。
エラーによりオブジェクトが保存されない場合は、これが 1,000 回連続して (正常な保存なしに) 発生すると、Populate() は終了します。
既定の動作
このセクションでは、Populate() メソッドが、以下の種類のプロパティに既定でデータを生成する方法について説明します。
Populate() メソッドは、ストリーム・プロパティを無視します。
リテラル・プロパティ
このセクションでは、Populate() メソッドが、以下の形式のプロパティに既定でデータを生成する方法について説明します。
Property PropertyName as Type;
Property PropertyName;
Type は、データ型クラスです。
このようなプロパティの場合、Populate() メソッドは、最初に名前を調べます。以下に示すように、一部のプロパティ名は特別に処理されます。
任意の大文字小文字の組み合わせで、プロパティ名が以下の場合 | データを生成するために Populate() が呼び出すメソッド |
---|---|
NAME | Name() |
SSN | SSN() |
COMPANY | Company() |
TITLE | Title() |
PHONE | USPhone() |
CITY | City() |
STREET | Street() |
ZIP | USZip() |
MISSION | Mission() |
STATE | USState() |
COLOR | Color() |
PRODUCT | Product() |
プロパティの名前が上記のいずれにも当てはまらない場合、Populate() メソッドはプロパティ・タイプを調べて、それに適した値を生成します。例えば、プロパティ・タイプが %StringOpens in a new tab の場合、Populate() メソッドはランダムな文字列を生成します (プロパティの MAXLEN パラメータが考慮されます)。別の例として、プロパティ・タイプが %IntegerOpens in a new tab の場合、Populate() メソッドはランダムな整数を生成します (プロパティの MINVAL および MAXVAL パラメータが考慮されます)。
プロパティにタイプがない場合、InterSystems IRIS は、そのプロパティ・タイプを文字列であると見なします。つまり、Populate() メソッドは、その値にランダムな文字列を生成します。
例外
Populate() メソッドは、プロパティがプライベート、多次元、または計算の場合や、プロパティに初期値式がある場合はデータを生成しません。
コレクション・プロパティ
このセクションでは、Populate() メソッドが、以下の形式のプロパティに既定でデータを生成する方法について説明します。
Property PropertyName as List of Classname;
Property PropertyName as Array of Classname;
これに該当するプロパティは、以下のようになります。
-
参照されるクラスがデータ型クラスの場合、Populate() メソッドは値のリストまたは配列を (適宜) 生成します。データの生成には、前述したデータ型クラスのロジックが使用されます。
-
参照されるクラスがシリアル・オブジェクトの場合、Populate() メソッドはシリアル・オブジェクトのリストまたは配列を (適宜) 生成します。データの生成には、前述したシリアル・オブジェクトのロジックが使用されます。
-
参照されるクラスが永続クラスの場合、Populate() メソッドは、参照されるクラスに含まれるエクステントのランダム・サンプルを実行し、そのサンプルからランダムに値を選択します。その値を使用してリストまたは配列を (適宜) 生成します。
シリアル・オブジェクトを参照するプロパティ
このセクションでは、Populate() メソッドが、以下の形式のプロパティに既定でデータを生成する方法について説明します。
Property PropertyName as SerialObject;
SerialObject は、%SerialObjectOpens in a new tab を継承するクラスです。
これに該当するプロパティは、以下のようになります。
-
参照されるクラスが %PopulateOpens in a new tab を継承している場合、Populate() メソッドはクラスのインスタンスを作成し、前述のセクションで説明したようにプロパティ値を生成します。
-
参照されるクラスが %PopulateOpens in a new tab を継承していない場合、Populate() メソッドは、そのプロパティの値を生成しません。
永続オブジェクトを参照するプロパティ
このセクションでは、Populate() メソッドが、以下の形式のプロパティに既定でデータを生成する方法について説明します。
Property PropertyName as PersistentObject;
PersistentObject は、%PersistentOpens in a new tab を継承するクラスです。
これに該当するプロパティは、以下のようになります。
-
参照されるクラスが %PopulateOpens in a new tab を継承している場合、Populate() メソッドは参照されるクラスに含まれるエクステントのランダム・サンプルを実行し、そのサンプルからランダムに 1 つの値を選択します。
そのため、参照されるクラスのデータを最初に生成しておく必要があります。または、他の何らかの方法でクラスのデータを作成します。
-
参照されるクラスが %PopulateOpens in a new tab を継承していない場合、Populate() メソッドは、そのプロパティの値を生成しません。
リレーションシップの詳細は、次のセクションを参照してください。
リレーションシップ・プロパティ
このセクションでは、Populate() メソッドが、以下の形式のプロパティに既定でデータを生成する方法について説明します。
Relationship PropertyName as PersistentObject;
PersistentObject は、%PersistentOpens in a new tab を継承するクラスです。
これに該当するプロパティは、以下のようになります。
-
参照されるクラスが %PopulateOpens in a new tab を継承している場合 :
-
リレーションシップのカーディナリティが one または parent の場合、Populate() メソッドは参照されるクラスに含まれるエクステントのランダム・サンプルを実行し、そのサンプルからランダムに 1 つの値を選択します。
そのため、参照されるクラスのデータを最初に生成しておく必要があります。または、他の何らかの方法でクラスのデータを作成します。
-
リレーションシップのカーディナリティが many または children の場合、Populate() メソッドは、このプロパティを無視します。これは、このプロパティの値が、このクラスのエクステントには保存されないためです。
-
-
参照されるクラスが %PopulateOpens in a new tab を継承していない場合、Populate() メソッドは、そのプロパティの値を生成しません。
POPSPEC パラメータの指定
%PopulateOpens in a new tab を拡張しているクラスの特定のプロパティについては、そのプロパティに Populate() メソッドでデータを生成する方法をカスタマイズできます。そのためには、以下を実行します。
-
このプロパティに適したランダムな値を返すメソッドを見つけるか、作成します。
%PopulateUtilsOpens in a new tab クラスには、そのようなメソッドが大量に用意されています。詳細は、クラスリファレンスを参照してください。
-
このプロパティの POPSPEC パラメータを指定して、このメソッドを参照するようにします。最初のサブセクションで詳細を説明します。
POPSPEC パラメータは、リストおよび配列プロパティに追加のオプションを提供します。これについては後続のサブセクションで説明します。
コレクション以外のリテラル・プロパティの場合は、このプロパティに使用する値を格納している SQL テーブル列を特定するという別の方法もあります。その後で、POPSPEC パラメータを指定して、このプロパティを参照するようにします。最後のサブセクションを参照してください。
また、クラス全体のデータ生成を制御する、クラス・レベルで定義された POPSPEC パラメータも存在します。これは、プロパティ特有の POPSPEC パラメータによって置き換えられた、旧式のメカニズムです (互換性のために含められています)。このトピックでは、これ以上の詳しい説明はしません。
非コレクション・プロパティの POPSPEC パラメータを指定する方法
コレクション以外のリテラル・プロパティには、以下のいずれかのバリエーションを使用します。
-
POPSPEC="MethodName()" — この場合、Populate() は %PopulateUtilsOpens in a new tab クラスのクラス・メソッド MethodName() を呼び出します。
-
POPSPEC=".MethodName()" — この場合、Populate() は生成されるインスタンスのインスタンス・メソッド MethodName() を呼び出します。
-
POPSPEC="##class(ClassName).MethodName()" — この場合、Populate() は ClassName クラスのクラス・メソッド MethodName() を呼び出します。
例 :
Property HomeCity As %String(POPSPEC = "City()");
指定のメソッドに引数として文字列値を渡す必要がある場合は、その文字列を囲む先頭の引用符と末尾の引用符を 2 つ続けます。以下に例を示します。
Property PName As %String(POPSPEC = "Name(""F"")");
また、指定したメソッドが返す値に文字列を追加することもできます。以下に例を示します。
Property JrName As %String(POPSPEC = "Name()_"" jr."" ");
その文字列を囲む先頭の引用符と末尾の引用符は 2 つ続ける必要がある点に注意してください。先頭に文字列を追加することはできません。POPSPEC は、メソッドが先頭になることを想定しているためです。
別の方法については、"SQL テーブル経由で POPSPEC パラメータを指定する方法" も参照してください。
リスト・プロパティの POPSPEC パラメータを指定する方法
プロパティがリテラルまたはオブジェクトのリストである場合は、以下のバリエーションを使用できます。
POPSPEC="basicspec:MaxNo"
以下はその説明です。
-
basicspec は、前のセクションに示した基本バリエーションの 1 つです。プロパティがオブジェクトのリストの場合は、basicspec を空のままにしておきます。
-
MaxNo は、リストに含まれる項目の最大数です。既定値は 10 です。
例 :
Property MyListProp As list Of %String(POPSPEC = ".MyInstanceMethod():15");
basicspec は省略できます。以下に例を示します。
Property Names As list of Name(POPSPEC=":3");
以下の例では、複数のデータ型のリストがあります。Colors は文字列のリスト、Kids は永続オブジェクトへの参照リスト、Addresses は埋め込みオブジェクトのリストです。
Property Colors As list of %String(POPSPEC="ValueList("",Red,Green,Blue"")");
Property Kids As list of Person(POPSPEC=":5");
Property Addresses As list of Address(POPSPEC=":3");
Colors プロパティのデータを生成するには、Populate() メソッドで、PopulateUtils クラスの ValueList() メソッドを呼び出します。この例では、引数として、このメソッドにコンマ区切りリストを渡している点に注意してください。Kids では、自動的に参照を生成する指定されたメソッドはありません。Addresses プロパティでは、シリアル Address クラスが %PopulateOpens in a new tab から継承され、データがそのクラスのインスタンスに自動的に入力されます。
配列プロパティの POPSPEC パラメータを指定する方法
リテラルまたはオブジェクトの配列であるプロパティには、以下のバリエーションを使用できます。
POPSPEC="basicspec:MaxNo:KeySpecMethod"
以下はその説明です。
-
basicspec は、前出の基本バリエーションの 1 つです。プロパティがオブジェクトの配列の場合は、basicspec を空のままにしておきます。
-
MaxNo は、配列内の項目の最大数です。既定値は 10 です。
-
KeySpecMethod は、配列のキーに使用する値を生成するメソッドの仕様です。既定は、String() です。これは、InterSystems IRIS が %PopulateUtilsOpens in a new tab の String() メソッドを呼び出すことを意味します。
以下の例では、数種類のデータのタイプと異なる種類のキーの配列を示します。
Property Tix As array of %Integer(POPSPEC="Integer():20:Date()");
Property Reviews As array of Review(POPSPEC=":3:Date()");
Property Actors As array of Actor(POPSPEC=":15:Name()");
Tix プロパティのデータは、PopulateUtils クラスの Integer() メソッドを使用して生成されています。このキーは、PopulateUtils クラスの Date() メソッドを使用して生成されています。Reviews プロパティには、指定されたメソッドがないので、自動的に参照が生成されることになります。またそのキーも、Date() メソッドを使用して生成されます。Actors プロパティには、指定されたメソッドはなく、自動的に参照が生成されます。またそのキーも、PopulateUtils クラスの Name() メソッドを使用して生成されます。
SQL テーブル経由で POPSPEC パラメータを指定する方法
POPSPEC には、ランダムな値を返すメソッドを指定する以外にも、使用する SQL テーブル名と SQL 列名を指定できます。このようにすると、Populate() メソッドは、そのテーブルの列から重複しない列値を返すダイナミック・クエリを作成します。このバリエーションの POPSPEC には、以下の構文を使用します。
POPSPEC=":MaxNo:KeySpecMethod:SampleCount:Schema_Table:ColumnName"
以下はその説明です。
-
MaxNo と KeySpecMethod はオプションです。これらは、コレクション・プロパティにのみ適用されます (リストおよび配列についてのサブセクションを参照)。
-
SampleCount は、指定の列から取得する非重複値の数です。これを開始点として使用します。この数が、その列に含まれる既存の非重複値の数よりも大きい場合は、すべての値が使用される可能性があります。
-
Schema_Table は、テーブルの名前です。
-
ColumnName は、列の名前です。
例 :
Property P1 As %String(POPSPEC=":::100:Wasabi_Data.Outlet:Phone");
この例では、プロパティ P1 は、Wasabi_Data.Outlet テーブルから取得した 100 個の電話番号のリストから、ランダムな値を受け取ります。
生成されたプロパティを別のプロパティのベースにする方法
場合によっては、あるプロパティ (A) に適した値のセットが、別のプロパティ (B) に存在する値に応じて決まることがあります。このような場合は、以下のようにします。
-
プロパティ A の値を生成するインスタンス・メソッドを作成します。このメソッドでは、インスタンス変数を使用して、プロパティ B (および考慮に入れる必要のあるその他のプロパティ) の値を取得します。以下に例を示します。
Method MyMethod() As %String { if (i%MyBooleanProperty) { quit "abc" } else { quit "def" } }
インスタンス変数の詳細は、"i%PropertyName" を参照してください。
該当するプロパティの POPSPEC パラメータで、このメソッドを使用します。"POPSPEC パラメータの指定" を参照してください。
-
特定の順序でデータを生成する必要のあるプロパティの POPORDER パラメータを指定します。このパラメータは整数にする必要があります。InterSystems IRIS は、POPORDER の値が小さいプロパティにデータを生成してから、POPORDER の値が大きいプロパティにデータを生成します。以下に例を示します。
Property Name As %String(POPORDER = 2, POPSPEC = ".MyNameMethod()"); Property Gender As %String(POPORDER = 1, VALUELIST = ",1,2");
%Populate の動作
このセクションでは、%PopulateOpens in a new tab が内部的にどのように動作するかを説明します。%PopulateOpens in a new tab クラスには、Populate() と PopulateSerial() の 2 つのメソッド・ジェネレータがあります。%PopulateOpens in a new tab を継承する各永続クラス、またはシリアル・クラスには、これら 2 つのメソッドの一方、または他方が (必要に応じて) 含まれます。
ここでは Populate メソッドだけを説明します。Populate() メソッドはループであり、要求されたオブジェクトの個数だけ繰り返されます。
ループの内部では、コードは以下のように動作します。
-
新規オブジェクトを作成します。
-
このプロパティに対する値を設定します。
-
オブジェクトを保存し、閉じます。
POPSPEC パラメータをオーバーライドしない単純なプロパティは、以下の形式のコードを使用して生成された値を持っています。
Set obj.Description = ##class(%PopulateUtils).String(50)
また、Name:Name() を指定して、%PopulateUtilsOpens in a new tab のライブラリ・メソッドを使用すると、以下が生成されます。
Set obj.Name = ##class(%PopulateUtils).Name()
埋め込み Home プロパティは、以下のようなコードを作成します。
Do obj.HomeSetObject(obj.Home.PopulateSerial())
ジェネレータはクラスのすべてのプロパティにわたってループし、一部のプロパティに対して以下のようなコードを作成します。
-
プロパティがプライベート、計算、多次元であるか、プロパティに初期値式があるかをチェックします。上記のいずれかが当てはまる場合、ジェネレータは終了します。
-
プロパティに POPSPEC オーバーライドがある場合、ジェネレータはそれを使用して終了します。
-
プロパティが参照の場合、最初にループするとき、ジェネレータはランダムな ID のリストを作成し、リストから 1 つ取って終了します。次のループからは、ジェネレータは単にリストから ID を取って終了します。
-
プロパティの名前が、特別に処理される名前のいずれかである場合、ジェネレータは、それに対応するライブラリ・メソッドを使用してから終了します。
-
ジェネレータがプロパティ・タイプに基づいたコードを生成できる場合は、コードを生成してから終了します。
-
それ以外の場合、ジェネレータはプロパティを空の文字列に設定します。
利用可能なメソッドのリストは、%PopulateUtilsOpens in a new tab を参照してください。
カスタム生成のアクションと OnPopulate() メソッド
生成されたデータを詳細に制御するには、OnPopulate() メソッドを定義します。OnPopulate() メソッドを定義しておくと、Populate() メソッドでオブジェクトを生成するたびにそのメソッドが呼び出されます。このメソッドは、プロパティに値を割り当てた後、オブジェクトがディスクに保存される前に呼び出されます。Populate() メソッドを呼び出すと、OnPopulate() メソッドがあるかどうかが確認され、Populate() メソッドで生成したオブジェクトごとに OnPopulate() が呼び出されます。
このインスタンス・メソッドは、プロパティに値を割り当てた後で、オブジェクトがディスクに保存される前に、Populate メソッドによって呼び出されます。このメソッドは、生成されたデータの追加の制御を提供します。OnPopulate() メソッドが存在する場合、Populate メソッドは、オブジェクトを生成するたびにこのメソッドを呼び出します。
そのシグニチャは、以下のとおりです。
Method OnPopulate() As %Status
{
// body of method here...
}
これは、プライベート・メソッドではありません。
このメソッドは、%StatusOpens in a new tab コードを返します。失敗ステータスの場合、生成されているインスタンスは破棄されます。
例えば、Memo というストリーム・プロパティを持っていて、生成時に値をそれに割り当てたい場合、OnPopulate() メソッドを提供します。
Method OnPopulate() As %Status
{
Do ..Memo.Write("Default value")
QUIT $$$OK
}
このメソッドは、%Library.PopulateOpens in a new tab のサブクラスでオーバーライドできます。
代替手段 : ユーティリティ・メソッドの作成
%PopulateOpens in a new tab クラスと %PopulateUtilsOpens in a new tab クラスのメソッドを使用する方法は、もう 1 つあります。スーパークラスとして %PopulateOpens in a new tab を使用するのではなく、目的のクラスに応じたデータを生成する、ユーティリティ・メソッドを作成します。
このコードでは、各クラスに対して目的の回数だけ繰り返し処理が実行されます。繰り返し処理ごとに、以下の手順を実行します。
-
新しいオブジェクトを作成します。
-
適切なランダム値 (または、ランダムに近い値) を使用して各プロパティを設定します。
プロパティのデータを生成するには、%PopulateOpens in a new tab または %PopulateUtilsOpens in a new tab のメソッドを呼び出すか、独自に作成したメソッドを使用します。
-
オブジェクトを保存します。
標準的な方法の場合と同様に、独立クラスのデータを生成してから、依存クラスのデータを生成する必要があります。
データに構造を構築するためのヒント
場合によっては、全体に対して特定の割合にのみ、特定の値を含めることが必要になります。$RANDOM 関数を使用してこれを行うことができます。例えば、この関数を使用して、引数として指定した切り捨てパーセンテージに応じて、True と False をランダムに返すメソッドを定義します。したがって、例えば、10% の場合や 75% の場合に True を返すことができます。
プロパティのデータを生成する場合、このメソッドを使用して、値を割り当てるかどうかを判別します。
If ..RandomTrue(15) {
set ..property="something"
}
ここに示す例では、レコードの約 15% がこのプロパティに対して指定された値を持つようになります。
この他の場合は、ディストリビューションのシミュレートが必要なこともあります。そのためには、くじ引きシステムをセットアップし、使用します。例えば、値の 1/4 を A に、1/4 を B に、1/2 を C にする必要があるとします。このくじ引きのロジックは、以下のようにすることができます。
-
1 ~ 100 (両端の値を含む) から 1 つの整数を選択します。
-
その数字が 25 より小さい場合は、値 A を返します。
-
その数字が 25 ~ 49である場合 (両端の値を含む) は、値 B を返します。
-
それ以外の場合は、値 C を返します。