2016-04-06 15 views
3

Ben bir itin-quickcheck pratik yapıyorum.junit-quickcheck - derinlik sınırını koruyarak rasgele ağaçlar üretiyor

İkili bir ağacın üç çeşit bileşeni için jeneratörler hazırladım (Node, Leaf, Empty).

Rastgele ağaçlar oluşturmak ve üzerlerinde özellikleri doğrulamak istiyorum.

Node s için jeneratör, belirli olasılıklara dayanarak iki dalı için başka jeneratörler seçer. Bununla birlikte, her çalışma sırasında ağaçların büyümesini durdurmasını istiyorum. Nesil geliştikçe Node olan bir alt ağaç oluşturma olasılığı düşmelidir.

Ağacın derinliğini GenerationStatus kullanarak kontrol edebilmeyi umuyordum, ancak tam olarak nasıl göremiyorum.

Başka bir hipotez, generate()'dan önceki sonraki jeneratörün configure() yöntemini çağırmaktır, ancak bunu henüz yapmadım.

Tüm bunlara ulaşmak için doğru yol nedir?

cevap

1

Jeneratörler arasındaki değerleri geçmek için GenerationStatus#setValue(Key, Object) kullanabilirsiniz. İşte

Bunun pozitif tamsayılar kesinlikle azalan listeleri oluşturur yazdığı bir örnek:

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

nasıl ağaca koymak ve bu değerlerden ağacı oluşturmak için bir değerler (sınırlanmış) listesi oluşturmak konusunda . O zaman yapının sınırlandığından emin olabilirsiniz.

add numaralı telefonu çağırmanın art arda dengesiz bir ağaç oluşturabileceği durumlarda ağacı dengelemeye dikkat etmek isteyebilirsiniz, ancak bu ağaç uygulamanıza bağlıdır.

Helder-Pereira'nun answer için olduğu gibi, özyinelemeli jeneratörlere gerek yoktur: Tam sayıların bir listesini oluşturur ve listeyi sıralardım.