0

2 つの異なるプラットフォーム (Win7 と Ubuntu PP) の Spring3 アプリで JUnit テストを実行しています。テスト/再現性の目的で、アプリケーションコンテキストで乱数発生器のシードを設定しました

<bean class="org.apache.commons.math3.random.MersenneTwister">
        <property name="seed" value="1111111" />
</bean>

さて今回のテスト

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { Config.APP_CONFIG_PATH })
public class StatTestAtomicInitOut {

@Autowired 
RandomGenerator rg;

@Test
public void testRandomGenerator() {

    Assert.assertEquals(9183, rg.nextInt(10000));

}

}

Windows7 では一貫して成功しますが、Ubuntu PP では一貫して失敗します (java.lang.AssertionError: expected:<9183> but was:<9561>)。

この他のテスト

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { Config.APP_CONFIG_PATH })
public class StatTestAtomicInitIn {

 @Autowired 
 RandomGenerator rg;

 @Test
 public void testRandomGenerator() {

    rg.setSeed(new Long(1111111));
    Assert.assertEquals(9183, rg.nextInt(10000));

 }

}

Windows7 と Ubuntu PP の両方で一貫してパスします。

Ubuntu で (Win7 ではなく) ランダム ジェネレーターの Spring 初期化を実行すると、実行時にシードを設定して取得した結果とは異なる結果が得られるのはなぜですか?

フィードバックをお寄せいただきありがとうございます。

ああ

4

1 に答える 1

0

この構成で

<bean class="org.apache.commons.math3.random.MersenneTwister">  
    <constructor-arg type="long" value="1111111" />
</bean>

テストは両方のプラットフォームで合格します。私を正しい軌道に乗せてくれた Tom McIntyre に感謝します。別の可能性は

<bean class="org.apache.commons.math3.random.MersenneTwister">
    <property name="seed" >
        <value type="long">1111111</value>
    </property>
</bean>

テストに合格します。

Spring がプラットフォームごとに異なるデフォルト セッターを選択する理由については、ややアカデミックな疑問が残ります。不思議なことに、少なくとも私にとっては、次の構成で

<bean class="org.apache.commons.math3.random.MersenneTwister">
    <property name="seed" >
        <value type="java.lang.Long">1111111</value>
    </property>
</bean>

StatTestAtomicInitOut は win7 ではパスしますが、Ubuntu では失敗します。

于 2013-01-11T08:43:13.577 に答える