java - 如何生成 LogN 唯一数字的排序列表,其中 N 是给定的数组大小?

标签 java list arraylist

所以基本上我想生成随机数并将它们放入给定大小 N 的列表中。

例如,这会生成一个排序列表,其中唯一数字的数量大约等于 N/2 如何修改它以使唯一数字大致等于 LogN?

     for (int i = 0; i < N; i++) {
         list.add(i, list.get(i) + new Java.util.Random.nextInt(2);
    }

最佳答案

如果您想要一个一致准确的 log(n) 唯一数字列表,为什么不先生成它们呢?您可以稍后填充数组。

import java.util.Random;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class RandomExample {

 public static void main(String[] args) {
  System.out.println(fillLogNUnique(100, 0, 100));
 }


 public static List <Integer> fillLogNUnique(final int n, final int lowLimit, final int highLimit) {
  final Random random = ThreadLocalRandom.current();

  // Assuming log base 2.0.

  final int requiredUniqueCount = (int) Math.floor(Math.log(n) / Math.log(2.0));
  final List <Integer> uniques = random
        .ints(lowLimit, highLimit)
        .limit(requiredUniqueCount)
        .boxed()
        .collect(Collectors.toList());

  return IntStream
        .range(0, n)
        .map(x -> uniques.get(random.nextInt(uniques.size())))
        .boxed()
        .collect(Collectors.toList());
 }
}

输入为n:所需随机数的数量,lowLimit:生成数字的下限,以及highLimit:上限。

其输出是:

[17, 29, 98, 17, 17, 29, 64, 64, 64, 17, 98, 98, 91, 17, 64, 50, 17, 50, 50, 64, 98, 91, 29, 50, 91, 50, 91, 98, 91, 98, 98, 29, 91, 91, 98, 64, 29, 98, 91, 50, 64, 50, 64, 17, 17, 50, 29, 29, 50, 50, 91, 50, 17, 17, 98, 64, 17, 98, 64, 17, 50, 17, 50, 50, 91, 50, 64, 91, 64, 91, 64, 64, 64, 91, 64, 64, 50, 50, 91, 50, 17, 17, 64, 98, 91, 17, 17, 17, 64, 50, 91, 29, 29, 91, 29, 50, 29, 91, 17, 91]

...正好是 6,因为基数为 2 的 log(100) 的整数值(下限)为 6。

请注意,此答案适用于 Java >= 8。

关于java - 如何生成 LogN 唯一数字的排序列表,其中 N 是给定的数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58120121/

相关文章:

java - java中找不到路径名

java - 在使用包含 map fragment 的 fragment 时使用 onbackpressed()

java - 如何对弹力球实现声明?

java - 尝试使用设置列表

python - 将实例列表转换为实例属性列表

java - cipher.getInstance() 的 DESede 和 TripleDES 之间的区别

c++ - 如何从列表中删除具有相应优先级队列的元素?

java - 如何将输入数据从 private void GUI 传输到 java 类中的 ArrayList?

java - 使用大数组列表加速自动完成算法

java - 方法参数和ArrayList