- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个包含 100 个元素的数组,我想打印出 20 个随机元素而不重复或有零。
我已经成功地从 1000 个数字中随机打印出 20 个数字,但我无法阻止它打印出重复项和/或零。有什么帮助吗?!
这是代码:-
import java.util.Random;
public class MyClass {
public static void main(String args[]) {
int[] persons = new int[1000];
int[] person = new int[20];
Random random = new Random();
for (int i = 0; i < person.length; i++)
{
person[i] = random.nextInt(persons.length);
System.out.println(person[i]);
}
}
}
最佳答案
这个问题可能会打破 APH 记录(每小时回答数),第一个小时内有 8 个回答。通常,这是一个不好的迹象,但令人惊讶的是,我没有找到我希望将此问题重复的问题。
不幸的是,大多数“简单”的答案在实践中可能有严重的缺陷。最重要的是,所提出的解决方案要么对某些设置效率低下,要么采用无法证明 Total Correctness 的技术。 - 即,可能无法证明算法会终止。这是指将随机数添加到 Set
并使用此 Set
跟踪不同元素数量的方法已被选中。因此,例如,在这段代码中
Set<Integer> set = new HashSet<Integer>();
Random random = new Random(0);
while (set.size() < sampleSize) {
set.add(min + rand.nextInt(max));
}
循环可能永远不会终止。您根本无法证明会选择 20 个不同的数字。 Random
实例可能会在第一次调用时返回 0
。它可能会在第二次调用中返回 0
。在第三个电话中.... you can never be sure.
当然,“在实践中”,循环通常迟早会终止,但这取决于参数:当要求在 0 到 10 之间选择 20 个不同的随机数时,它不会终止。这同样适用于类似的技术,例如
int[] ints = new Random(0).ints(0, 10).distinct().limit(20).toArray();
所以应该仔细检查参数,以确保它们在这方面是有效的。
经常以各种形式建议的另一个选项是在预先填充了可供选择的项目的列表上使用 Collections#shuffle
。这可能适用于您的情况,该列表可能只有 100 或 1000 个元素。但是填充一个列表,比如说 100000000 个元素太耗费内存,洗牌这个列表太耗时。
一般来说,有一种相当通用的技术可以解决这个问题。它被称为 Reservoir Sampling .
(请注意,关于水库采样的实现存在一些问题,但似乎并未提出将其作为这项非常通用的任务的解决方案)
这是 Java 中水库采样的实现。对于给定的样本大小和范围,它按升序返回所需范围内的(随机的、唯一的)整数集合:
/**
* Creates a collection with the given size, containing random values
* between the given minimum value (inclusive) and maximum value
* (exclusive). The resulting collection will contain the values
* in ascending order.
*
* @param size The size of the returned collection
* @param min The minimum value (inclusive)
* @param max The maximum value (exclusive)
* @param random The random number generator
* @return The collection
* @throws IllegalArgumentException If the requested size is larger than
* the difference between the maximum value and the minimum value
*/
public static Collection<Integer> randomSample(
int size, int min, int max, Random random)
{
if (size > max - min)
{
throw new IllegalArgumentException(
"Can not create a sample of size "+size+
" with values between "+min+" and "+max);
}
Set<Integer> set = new LinkedHashSet<Integer>(size);
int n = size;
for (int i = 0; i < max - min; i++)
{
double d = (double) size / ((max - min) - i);
if (random.nextDouble() < d)
{
set.add(i + min);
n--;
}
if (n <= 0)
{
break;
}
}
return set;
}
(如果此实现有任何缺陷或不足,请在评论中给我留言)。
这可以作为类似任务的构建 block 。例如,在您的情况下,您可以创建一个随机样本的索引,并使用它来选择所需的元素:
int persons[] = new int[1000];
int sample[] = new int[20];
Collection<Integer> indices = randomSample(20, 0, 1000);
int n = 0;
for (Integer index : indices)
{
sample[n] = index;
n++;
}
对于其他情况,您可能希望根据返回的索引创建一个列表并打乱该列表。但在这种情况下,只有(小的)样本需要打乱,而不是包含所有可能输入的(可能很大的)列表。
关于java - 如何避免使用 java 随机函数重复和零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36713888/
我想知道如何考虑需要您做出某些选择才能看到最终结果的搜索系统。我说的是 select 表单,您可以在其中根据您的选择继续操作,然后您会看到结果。 下面描述了我正在谈论的一个随机示例。想象一下 Init
您好,我目前正在编写一些软件来管理我们的库存。我搜索了 2 个表 master_stock(保存每一个股票代码和描述)库存(保存库存代码、地点、数量...) 一切都很好,但这是我遇到的问题。 假设我的
我有 2 个表,我想合并其数据。id 是我的关键字段(增量且不同)。表1和表2字段说明例如:id - 名称 - 值 我想将表2的所有数据插入表1,它们有不同的数据,但在某些行中有相同的id。 所以当我
我正在努力解决汇编中的一个问题,我必须获取十六进制代码的第一个字节 (FF) 并将其复制到整个值中: 0x045893FF input 0xFFFFFFFF output 我所做的
我有 Eclipse Indigo 版本,我可以在其中运行 Java 和 C++ 项目。 但我只想使用另一个 Eclipse 来编写 C++ 项目。所以我将 eclipse(不是工作区)的源文件夹复制
This question already has answers here: What is a NullPointerException, and how do I fix it? (12个答案)
This question already has answers here: Numbering rows within groups in a data frame (8个答案) 5个月前关闭。
我知道用q记录到寄存器中,但我想知道是否可以设置一些东西来快速调用最后一个记录,就像一样。 回顾最后一个简短的编辑命令(有关 的讨论请参阅 here。)。 我知道@@,但它似乎只有在执行@z之后才起作
来自 Eclipse 并且一直习惯于复制行,发现 Xcode 没有这样的功能是很奇怪的。或者是吗? 我知道可以更改系统范围的键绑定(bind),但这不是我想要的。 最佳答案 要删除一行:Ctrl-A
假设我有一个包含元素的列表,例如[1,2,3,4,5,6,7,8]。我想创建长度为 N 的该元素的所有排列。 因此,对于N = 4,它将是[[1,1,1,1],[1,1,1,2],[1,1,2,1],
我有一个带有 JMenu 的 JFrame。当我在某些情况下添加包含图像的 JPanel 时,程序首次启动时菜单会重复。调整大小时重复的菜单消失。任何建议都非常感激。谢谢。代码如下: public c
我正在尝试查找目录中文件的重复项。 我对这个 block 有一个问题,它以文件地址作为参数: public void findFiles(ArrayList list){ HashMap hm
我知道这个问题已经发布并且已经给出了答案,但我的情况不同,因为我在单个方法上填充多个下拉列表,所以如果我点击此链接 After every postback dropdownlist items re
我正在尝试为我的日历应用程序实现重复模式。我希望它的工作方式与 Outlook 在您设置重复约会时的工作方式相同。 public async Task> ApplyReccurrencePeriod
我有一个利用 cookie 来支持准向导的应用程序(即,它是一组相互导航的页面,它们必须以特定顺序出现以进行注册)。 加载 Logon.aspx 页面时 - 默认页面 - 浏览器 cookie 看起来
我有 3 个输入,代码检查它们是否为空,如果为空,则将变量值添加到输入中。 所以我有 3 个具有值的变量: var input1text = "something here"; var input2t
根据数组的长度更改数组的每个元素的最佳方法是什么? 例如: User #1 input = "XYZVC" Expected Output = "BLABL" User #2 input = "XYZ
我在让 Algolia 正常工作时遇到了一些麻烦。我正在使用 NodeJS 并尝试在我的数据库和 Algolia 之间进行一些同步,但由于某种原因似乎随机弹出大量重复项。 如您所见,在某些情况下,会弹
遵循以下规则: expr: '(' expr ')' #exprExpr | expr ( AND expr )+ #exprAnd | expr ( OR expr )+ #exprO
我有一个布局,我想从左边进入并停留几秒钟,然后我希望它从右边离开。为此,我编写了以下代码: 这里我在布局中设置数据: private void loadDoctor(int doctorsInTheL
我是一名优秀的程序员,十分优秀!