java-大家觉得我这个算法够随机吗?

问题描述

大家觉得我这个算法够随机吗?
是阿里巴巴的一道笔试题,用nextInt(int i),这个方法能产生0~ (i-1)的其中一个随机数,
去产生1~1000中不重复的900个随机数,我只弄了1~1000个随机数,计数截取的部分省略

 import java.util.*;public class TestString {    public static void main(String[] args) {        myWay(1 4);    }    public static void myWay(int star int end) {        if(star == end ) {            System.out.println(star);            return;        }        Random r1 = new Random();        int i = star + r1.nextInt(end - star + 1) ;        System.out.println(i);        Random r2 = new Random();        int j = r2.nextInt(2);        if(j == 0) {            if(i != star) myWay(star i - 1);            if(i != end) myWay(i + 1 end);        }        if(j == 1) {            if(i != end) myWay(i + 1 end);            if(i != star) myWay(star i - 1);        }    }}

解决方案

你的代码有很严重的问题,就是你递归调用myway,而Random r2 = new Random();不断执行,由于时间很短,而它又是根据时间产生的随机种子,所以这样会导致随机数不随机。
而且你的算法也有问题,你的目标是随机,而不是均匀。
具体算法不表了,自己google 洗牌算法

解决方案二:
http://developer.51cto.com/art/200906/128348.htm

解决方案三:
很简单,你可以产生 1 2 3 4 ... 900
这个结果么?
虽然这个概率极低,但是从数学上说不是没有可能。如果你的算法被证明不能产生这个结果,那么它就不随机。
你还可以设计别的随机实验去验证。

解决方案四:
哎 朋友,这个题这样审题对吗?我在想看了你的题意只是说他告诉你了一个nextInt函数,让你直接用,在nextInt的基础上产生900个随机数。
就是不用java自己的随机算法,通过巧妙利用nextInt来写程序。
这种题应该是偏向于算法的,我认为应该这么审题:
因为nextInt是只能连续数中取出随机的,所以应该利用一些数学知识来把随机取好几次改变成在剩余的不连续的数中依然使用nextInt取随机。
具体方法我认为是链表法,就是建立一个1000长的ArrayList,然后通过get(int n)方法抽出来随机取出的数并删除节点。这样就达到了题目的要求,我并没有用任何java内部的生成随机数的方法就解决了这个题。
简单的代码:
Arraylist a blablabla

int results=new int[900];
for(int count=1000;count>100;count--){
int i=nextInt(count);
results[1000-count]=a.get(i);
a.remove(i);
}

我觉得这才是题目的本意

时间: 2024-09-28 02:29:07

java-大家觉得我这个算法够随机吗?的相关文章

有没有基于JAVA计算机调课的算法,并且已经程序实现该算法

问题描述 有没有基于JAVA计算机调课的算法,并且已经程序实现该算法 基于JAVA计算机调课的算法,并且已经代码实现该算法.就是在一定的(现有的)排课基础上,鞥实现计算机自动调课 解决方案 我们先将所有的班级从数据库中取出来,为所有的班级添加上每周20个时间片(时间片的意思是一个班级在一周内所能上课的时间点),然后我们将所有的班级随机加入该班级要上的课程,加入完成后我们将其按照从大到小的顺序排序,然后我们循环20个时间片,分别取出该时间片内的所有班级,然后我们将教室取出来并且按从大到小排序,我们

Java实现DES加解密算法解析_java

本文实例讲述了Java实现DES加解密算法解析.分享给大家供大家参考,具体如下:   简介: 数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款机(Automated Teller Machine,ATM)都使用DEA.它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用

java weka 朴素贝叶斯算法 数据分类问题

问题描述 java weka 朴素贝叶斯算法 数据分类问题 现在有一个需求需要实现如下功能: 根据x,y,z的值得到状态,比如:0.5,0.1,0.2 状态是sit;0.6,0.1,0.2 状态是stand. 后来上网查到weka这个东西,因为我对算法确实不太了解,也没看懂,只能模仿. 我有一个训练样本,命名test1.arff,内容的一部分如下: @relation test1 @attribute x numeric @attribute y numeric @attribute z num

既然java语言提供了排序算法的封装,为什么我们还要自己写冒泡

问题描述 既然java语言提供了排序算法的封装,为什么我们还要自己写冒泡 一个关于排序的问题:既然java语言提供了排序算法的封装,为什么我们还要自己写冒泡排序?什么时候用到冒泡排序? 解决方案 目的是为了让你学习,冒泡排序是最容易理解的排序算法. 解决方案二: Java语言写的各种排序算法[未完] 解决方案三: java封装好的是快排吧,首先快排是不稳定排序,只是平均时间复杂度最低而已.简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳.当数据量过大时堆排序的优势又体现

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)_java

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

图文讲解Java中实现quickSort快速排序算法的方法_java

相对冒泡排序.选择排序等算法而言,快速排序的具体算法原理及实现有一定的难度.为了更好地理解快速排序,我们仍然以举例说明的形式来详细描述快速排序的算法原理.在前面的排序算法中,我们以5名运动员的身高排序问题为例进行讲解,为了更好地体现快速排序的特点,这里我们再额外添加3名运动员.实例中的8名运动员及其身高信息详细如下(F.G.H为新增的运动员): A(181).B(169).C(187).D(172).E(163).F(191).G(189).H(182) 在前面的排序算法中,这些排序都是由教练主

Java代码实践12306售票算法(二)_java

周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Ticket信息 * * @param train * @return */ public static List<Ticket> initTicketList(Train train) { List<Ticket> result = new ArrayList<Ticket&g

Java版本的回文字算法(java版本)_java

废话不多说了,直接给大家贴代码了,具体代码如下所述: package com.gdh.backtext; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class BackText { String text; public BackText() { super(); this.text = null; } public BackText(String text) { supe

Java抢红包的红包生成算法_java

马上过年了.过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]. 最简单的思路,先保底,每个小红包保证有min,然后每个请求都随机生成一个0到(max-min)范围的整数,再加上min就是红包的钱数. 这个算法虽然简单,但是有一个弊端:最后生成的红包可能都是min钱数的.也就是说可能