2016-04-06 7 views
3

私はjunit-quickcheckを練習しています。junit-quickcheck - 深さを有限に保ったランダムなツリーを生成する

私はバイナリツリーの3つのソートコンポーネント(Node,Leaf,Empty)のジェネレータを用意しました。

ランダムなツリーを作成し、プロパティを検証したいと考えています。

Nodeのジェネレータは、特定の確率に基づいて2つのブランチのジェネレータを選択します。

ただし、実行するたびにしばらくの間、ツリーの成長が止まるようにします。 Nodeであるサブツリーを構築する確率は、生成が進展するにつれて減少しなければならない。

GenerationStatusを使用してツリーの深さを制御できることを期待していましたが、正確にはわかりません。

もう1つの仮説は、generate()の前に次のジェネレータのメソッドconfigure()を呼び出すことですが、まだそれを行うことはできません。

これを達成する正しい方法は何ですか?

答えて

1

GenerationStatus#setValue(Key, Object)を使用して、ジェネレータ間で値を渡すことができます。

import com.pholser.junit.quickcheck.generator.GenerationStatus; 
import com.pholser.junit.quickcheck.generator.Generator; 
import com.pholser.junit.quickcheck.random.SourceOfRandomness; 

import java.util.ArrayList; 
import java.util.List; 

public class ListGenerator extends Generator<List<Integer>> { 

    private static final int MAX_VALUE = 100; 
    private static final GenerationStatus.Key<Integer> PREVIOUS_KEY = new GenerationStatus.Key<>("previous", Integer.class); 

    @SuppressWarnings("unchecked") 
    public ListGenerator() { 
     super((Class<List<Integer>>) (Class) List.class); 
    } 

    public List<Integer> generate(SourceOfRandomness sourceOfRandomness, GenerationStatus generationStatus) { 
     List<Integer> result = new ArrayList<>(); 

     int previous = generationStatus.valueOf(PREVIOUS_KEY).orElse(MAX_VALUE); 
     int current = sourceOfRandomness.nextInt(previous); 

     if (current > 0) { 
      result.add(current); 

      generationStatus.setValue(PREVIOUS_KEY, current); 
      Generator<List<Integer>> listGen = gen().make(ListGenerator.class); 
      result.addAll(listGen.generate(sourceOfRandomness, generationStatus)); 
      generationStatus.setValue(PREVIOUS_KEY, null); 
     } 

     return result; 
    } 
} 
1

あなたについてのツリーに入れるべき値の(有界)のリストを生成し、これらの値からツリーを構成する方法:ここで

は、私はそれが厳密に正の整数のリストを減少生成書いた例です。 。次に、構造体が束縛されていることがわかります。

addを順番に呼び出すと高度に不均衡なツリーが生成される場合は、ツリーのバランスに注意してください。ただし、ツリーの実装によって異なります。

Helder-Pereiraのanswerと同様に、再帰的なジェネレータは必要ありません。整数のリストを生成し、リストをソートします。

関連する問題