我有两个列表,一个包含字母,一个包含相应的值。相应的值列表告诉了一个项目在以后的新列表生成中可以使用多少次。
所以,过程如下。我生成随机数,它们是从 charList 中随机获取项目的索引。当我有一个随机列表(其中项目可以多次出现)后,我需要检查此列表,如果某个项目不再出现,然后在 maxOccurranceList 中指示。检查后,如果列表合适,我返回 true,如果不合适,我返回 false,因此随机列表生成再次开始。
问题是有时需要很长时间(例如10-20分钟)才能获得合适的列表,这显然是很长的时间。我需要一个可以加快此过程的解决方案。
我想知道如果我在 while 循环中放入一个计数器,当计数器达到例如 1000 时,我会重新设置 Random 类的种子。这行得通吗?
这是代码:
//This is an example input list:
ArrayList<String> charList = new ArrayList<>();
charList.add("A");
charList.add("B");
charList.add("C");
ArrayList<Integer> maxOccurranceList = new ArrayList<>();
maxOccurranceList.add(1);
maxOccurranceList.add(1);
maxOccurranceList.add(1);
ArrayList<String> selectedItemsList = new ArrayList<>();
Random random = new Random();
boolean isFitMaxOccurrance = false;
while(isFitMaxOccurrance == false){
List<Integer> rndNumbers = random.ints(1, 0, charList.size()).boxed().collect(Collectors.toList());
for (int i = 0; i < rndNumbers.size(); i++) {
selectedItemsList.add(charList.get(rndNumbers.get(i)));
}
isFitMaxOccurrance = setThisTrueIfListFitTheMaxExpectations(selectedItemsList);
}
//The example output list may be: [B, C, A] or [A, C, B]
//But consider that both list can be any long and the maxOccurrance values can be any number, this example is a situation when generation takes very long time.
“...我有两个列表,一个包含字母,一个包含对应的值。对应的值列表告诉了一个项目在后面的新列表生成中可以使用多少次。...”
我会先说我不明白实用性。
可能有更好的方法来抽象它。
这是一个例子。
请注意,如果任何值的最大出现次数超过 2,则它看起来会无限循环。
Random r = new Random();
List<Character> a = new ArrayList<>(), z = new ArrayList<>();
List<Integer> b = new ArrayList<>();
int v, i, f, n = 0, m = 0;
for (char c = 'A'; c <= 'Z'; c++, n++, m += v) {
a.add(c);
b.add(v = r.nextInt(1, 3));
}
boolean exit = false;
char c;
while (!exit) {
z.add(c = a.get(i = r.nextInt(0, n)));
if ((f = Collections.frequency(z, c)) > b.get(i))
while (--f > 0) z.remove((Character) c);
if (z.size() == m) exit = true;
}
这是一些输出
[O, M, N, E, B, E, X, Y, B, P, Q, S, X, J, H, L, C, U, Z, G, Z, U, D, H, M, K, T, D, L, V, A, F, R, I, W, P, K]
[B, P, P, B, N, J, L, S, X, D, A, Y, X, U, R, L, C, H, U, C, E, A, G, W, I, K, M, M, D, V, Z, F, T, O, Q, T, S, K, J]
[Q, L, J, A, U, P, P, G, Q, R, E, V, X, Z, S, U, N, C, C, T, X, B, Y, V, T, O, S, J, H, W, M, K, H, F, D, I, R]