java - 如何生成 LogN 唯一数字的排序列表,其中 N 是数组的给定大小?
问题描述
所以基本上我想生成随机数并将它们放入给定大小 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,因为log(100)
底数 2 的整数值(下限)为 6。
请注意,此答案适用于 Java >= 8。
推荐阅读
- javascript - 为什么在 JavaScript 中,如果有一个方法 replaceAll() 可能会更好?
- html - 样式标题:从 W3.CSS 中删除边距
- sql-server - SQL Server - 如何使用还包含逗号的数据导入逗号分隔文件
- php - PHP/MySQL 表,多月无结果
- reactjs - 将组件内的子组件作为模板
- javascript - Vue.js 组件不显示
- php - 分页循环仅显示两页
- css - 角材料表标题文本断开到下一行
- c# - 无法将“System.DBNull”类型的对象转换为 C# 中的“System.String”类型
- php - 模态中的输入值总是得到最后一条记录