0

我在两个不同平台(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 回答