Tag: shuffle

Java Collections.shuffle()奇怪的行为

我正在经历一些奇怪的事情。 我有一个很大的长数列表。 它按升序包含大约20万个数字。 这些数字总是截然不同的; 它们不一定是连续的,但它们中的一些通常是连续的。 我想从这个列表中提取一个5k的已排序样本,所以基本上这是我的方法: 我调用java.util.Collections.shuffle(list); 我从现在洗牌的list提取出前5k个元素 我按升序对提取的元素进行排序 不过,我的结果有些奇怪。 如果不是连续的话,我提取的很多随机长片看起来很可疑。 例如,我得到了: … 38414931, 38414932, 38414935, 38414937, 38414938, 38414939, 38414941, … 这绝对不是随机的:/ 有一个更奇怪的事情。 在调试时,我尝试将初始list和提取的样本写入文件以进行比较。 如果我这样做,我的问题似乎消失了,我提取的Longs看起来像是正确的随机数。 当然,我已经重复了很多次,每次我都经历过这两种行为。 我错过了什么吗? 编辑:这是我正在使用的代码: List allNumbers = ; —>如果在这里我将allNumbers写入文件,它似乎工作正常 Collections.shuffle(allNumbers); HashSet randomNumbers = new HashSet(); for (int i = 0; i < 5000; i++) { randomNumbers.add(allNumbers.get(i)); }

Collections.shuffle()是否足够随机? 实际的例子似乎否认了这一说法

我在java.util.List有1000个唯一对象,每个对象都引用一个图像,1000个列表中的每个图像都是唯一的,现在我想要将它们混洗,这样我就可以使用前20个对象并呈现它们到网站用户。 然后,用户可以单击“Shuffle”按钮,然后从头开始再次检索1000个图像并再次调用shuffle() 。 然而,似乎在1000个图像对象中,我经常在20个图像选择之间反复看到相同的图像。 有些东西似乎是错的,有什么更好的建议,建议吗? 我的代码非常简单: List imagePaths = get1000Images(); Collections.shuffle(imagePaths); int i = 0; for (String path: imagePaths) { … do something with the path … i++; if (i >= 20) break; } 我知道Collections.shuffle()分布很好:例如参见http://blog.ryanrampersad.com/2012/03/03/more-on-shuffling-an-array-correctly/ 但是,我只是觉得在一组20张图像中一次又一次地看到相同图像的概率应该少得多…… 输入高度赞赏。

如何随机播放数组的内容

所以我的程序应该访问一个文本文档然后做所有当前工作的爵士乐。 我无法弄清楚的唯一问题是如何将数组的内容混洗而不让它们最终相互叠加。 互联网和使用随机和for循环的多次尝试都是无用的。 这是我的代码: import java.io.*; import java.util.*; public class lab_6 { public static void main(String[] args)throws FileNotFoundException { Scanner input = new Scanner(System.in); //reads from keyboard System.out.println(“What is the name of your file. “); String name = input.nextLine(); Scanner reader = new Scanner(new File(name));// Open text file System.out.println(“how many names are in your array”); […]

在java中混洗JSON数组的有效方法?

这是最好的方法吗? 现在,我将我的JSONArray转换为自定义类的ArrayList ,使用Collections.shuffle()来执行操作,并转换回JSONArray ,这似乎是太多的开销。 答案可能只是为了实现Fisher-Yates洗牌 ,但我的猜测是这可能已经完成所以我想避免重新发明轮子。 我查看了标准的JSON api和Google的Gson,但它们似乎没有任何实现。 此问题中的标准数组也有简单的选项可以轻松移植到java,但我很乐意听到您的输入。 令我惊讶的是,查询http://www.google.com/search?q=java+shuffle+jsonarray并未充斥我的方法。

强制分区存储在特定执行程序中

我有5个parititions-RDD和5个工人/执行者。 我怎样才能让Spark将每个RDD的分区保存在不同的worker(ip)上? 如果我说Spark可以在一个工作人员上保存几个分区,而在其他工作人员上有0个分区,我是对的吗? 我可以指定分区数,但Spark仍然可以在单个节点上缓存所有内容。 复制不是一种选择,因为RDD是巨大的。 我找到的解决方法 getPreferredLocations RDD的getPreferredLocations方法不提供100%保证该分区将存储在指定节点上。 Spark将在spark.locality.wait期间spark.locality.wait ,但之后Spark将在不同节点上缓存分区。 作为workarround ,您可以为spark.locality.wait设置非常高的值并覆盖getPreferredLocations 。 坏消息 – 你不能用Java做到这一点,你需要编写Scala代码。 至少Scala内部包含Java代码。 即: class NodeAffinityRDD[U: ClassTag](prev: RDD[U]) extends RDD[U](prev) { val nodeIPs = Array(“192.168.2.140″,”192.168.2.157″,”192.168.2.77”) override def getPreferredLocations(split: Partition): Seq[String] = Seq(nodeIPs(split.index % nodeIPs.length)) } SparkContext的makeRDD SparkContext有makeRDD方法 。 这种方法缺乏文献记载。 据我所知,我可以指定首选位置,而不是设置spark.locality.wait高值。 坏消息 – 首选位置将在第一次shuffle / join / cogroup操作中被丢弃 。 这两种方法都有一个太高spark.locality.wait缺点,如果一些节点不可用,可能会导致您的集群sturve。 PS更多背景 我有多达10,000个sales-XXX.parquet文件,每个文件代表不同地区不同商品的销售情况。 […]

如何将没有两个重复的字符数组混合在一起?

我在接受采访时被问到这个问题: 如何将没有两个重复的字符数组混合在一起? 我想出的算法是: 有一个字符的HashMap ,字符对的出现次数。 通过此查找重复与唯一元素的计数。 如果duplicate> unique,则不能形成一个没有2个重复元素的混洗数组(?) 如果unique> = duplicate,则有2个堆栈 – 1个包含唯一字符,1个包含重复字符。 构造结果数组的方式是首先从唯一堆栈中弹出元素,然后从重复堆栈中弹出元素。 重复 例如: [a,b,b,c] shuffled array with above algorithm – [a,b,c,b]; [b,b,b,c] unique < duplicate return error 但我很确定我的逻辑过于复杂。 有没有更容易和万无一失的方法来做到这一点?

如何“洗牌”arrays?

我正在努力创建一个“shuffleDeck()”方法。 我要做的是创建一个方法,它将采用一个数组参数(这将是卡片组)洗牌,并返回洗牌数组列表。 这是代码: class Card { int value; String suit; String name; public String toString() { return (name + ” of ” + suit); } } public class PickACard { public static void main( String[] args) { Card[] deck = buildDeck(); // display Deck(deck); int chosen = (int)(Math.random()* deck.length); Card picked = deck[chosen]; System.out.println(“You picked […]