我对编程很新,我可能会尝试在我走路之前跑,但基本上我有一个字符串列表,在每个打印行的末尾,我想随机选择一个字符串。我做了这个,它确实选择了一个随机字符串,但问题是每次它在程序中使用它坚持一个随机字符串。
String items[] = {"bla bla", "asdnoaisd", "anafgsfsan"};
int amount;
String list;
Random r = new Random();
amount = (int) (Math.random()*25+1);
list = items[r.nextInt(12)];
帮助将不胜感激
更新 - 所以我可能措辞错了。问题是没有得到一个随机字符串,但我需要它在每次使用后重置,所以在使用它之后它应该重置并从列表中选择另一个字符串。
Random r = new Random();
创建一个伪随机值列表。要在每次运行程序时获得其他结果,请使用:
Random r = new Random(System.currentTimeMillis());
代替。
您要求从列表中选择一个随机值,并提到想要在每次选择后“重置”。这通常被称为“sampling with replacement”,这意味着当您选择样本时,您不会更改下次再次选择它的概率。想象一下来自牌组的抽牌 - 更换后你将卡片放回并重新洗牌,无需更换,将其放在一边并从(现在较小的)牌组中抽出。
使用替换采样很容易在Java中实现,只需使用Random.nextInt(int)
选择0和列表大小之间的随机值。返回的整数是从列表中获取的索引。
无替换采样有点琐碎(或需要不同的数据结构),因为您必须修改原始列表或存储先前看到的值集。您应该更喜欢哪种值取决于您需要选择多少个值。
有几个人建议使用Collections.shuffle()
,但它比简单生成随机索引更具侵入性。 Random.nextInt()
是O(1)并且不会以任何方式修改您的列表。 Collections.shuffle()
必须迭代整个列表,花费O(n log n)时间,并修改您的列表。如果您需要从列表中选择多个值,或者想要无替换选择(在这种情况下,您需要随机播放一次,然后只是遍历列表),这将非常有用。
最简单的方法是使用时间,
list = items[(int)(System.currentTimeMillis() % items.length)];
你是用list = items[r.nextInt(12)] ?
初始化随机字符串你什么时候实际使用list
?我甚至不会使用list
我只是插入行items[r.nextInt(12)];
当你需要访问它并以这种方式使用它将每次生成一个新的随机数而不是我用一个随机数初始化它并使用其余的你的程序。
而不是数组,使用List
。
然后,使用Collections.shuffle()
。现在只需遍历您的列表即可。