该数据库由241个国家及其各自的首都组成。该方法应该随机选取数据,50%的时间询问国家,50%的时候询问首都。我可以从列表中随机选择数据,但无法获得每个问题50%的提问次数。(Math.random((<0.5(在if语句中50%的时间没有返回问题,这是不同的。这里需要帮助!
public String pick() {
List<String> capitals = db.getCapitals();
System.out.println(capitals.size());
int n = capitals.size();
int index = (int) (n * Math.random());
String c = capitals.get(index);
System.out.println(c);
Map<String, Country> data = db.getData();
System.out.println(data.size());
Country ref = data.get(c);
System.out.println(ref.toString());
String question;
if (Math.random() < 0.5) {
question = ref.getCapital() + " is the capital of?n" + ref.getName();
}
else {
question = "What is the capital of " + ref.getName() + "?n" + ref.getCapital();
}
return question;
}
使用两个数据源可获得50%的结果
正如评论所说,随机结果将倾向于在许多事件中的赔率。对于少数事件,您无法预测/期待某些结果。
正如Ken Y-N所评论的,如果你想要恰好一半的国家和一半的首都,那么你需要收集两个源数据:一个国家的集合,一个首都的集合。从一个集合中随机选择一半问题,从另一个集合选择一半问题。
List.of
方法是生成不可修改列表的一种方便方法。
对于您的随机数生成器,通常最好使用ThreadLocalRandom
。调用静态方法current
会自动为您提供一个生成器,供您在特定线程中使用。这个类提供了一些方便的方法,比如带有原点和边界的nextInt
。出于特殊目的,您可能需要一个更真实随机的生成器,但不适合您的情况。
List < String > countries = List.of( "Brazil" , "France" , "Morocco" , "Sweden" , "Japan" , "Canada" , "Kenya" , "Spain" , "Seychelles" , "Ireland" );
List < String > capitals = List.of( "Brasília" , "Paris" , "Rabat" , "Stockholm" , "Tokyo" , "Ottawa" , "Nairobi" , "Madrid" , "Victoria" , "Dublin" );
int limit = 6; // The total number of questions we want to present to the user.
if ( ! ( limit % 2 == 0 ) ) { throw new IllegalStateException( "Must be an even number." ); }
List < String > results = new ArrayList <>( 6 );
// Countries
for ( int i = 0 ; i < limit / 2 ; i++ )
{
int index = ThreadLocalRandom.current().nextInt( 0 , countries.size() ); // ( inclusive, exclusive )
String result = countries.get( index );
results.add( result );
}
// Capitals
for ( int i = 0 ; i < limit / 2 ; i++ )
{
int index = ThreadLocalRandom.current().nextInt( 0 , capitals.size() ); // ( inclusive, exclusive )
String result = capitals.get( index );
results.add( result );
}
System.out.println( "results = " + results );
示例结果:
results=[巴西、日本、日本、都柏林、内罗毕、渥太华]
如果你想混淆国家和首都的顺序,请在代码底部添加此调用:
Collections.shuffle( results );
results=[渥太华,马德里,瑞典,巴西,渥太华,肯尼亚]