import java.util.Random;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Collection;
import java.util.HashSet;
/*
大神看下我的代码有什么错误
*/
public class zimu {
public static void main(String[] args) {
Random r=new Random();
HashSet arr=new HashSet();
int g=0;
Map<Integer,Character>map=new HashMap<Integer,Character>();
for (int i = 0; i<26;i++) {
int temp=r.nextInt(26);
char x=(char)((temp%26)+65);
if(arr.contains(x)==true)
{
i=0;
g++;
arr.clear();
}else
{arr.add(x); map.put(i,x);
}
}
Set<Integer> keys=map.keySet();
for (Integer i : keys) {
System.out.println(i+"--"+map.get(i));
}
System.out.println(g+"次");
}
}
你不觉得这个多少次很依赖运气吗 运气好它一次不重复的给你输出来,运气不好要穷尽所有可能结果才能完全输出,额,不对,万一它就一直随机那几个已输入的几个字母呢? 比如已经输出A-Y了,最后一个Z它死活没有随机到,那么不就会一直执行吗 我没看代码,我是看标题评论的 (*/ω\*)
可是他说了不能重复了啊,也就是说会有去重的判断,那当然就是26次输出26个字母啦~
@暴躁的三胖: 你确定26次就能随机出26个不同字母?? if(重复){重新随机;随机次数++;} 随机出重复的概率是很高的,这个无法避免,一随机出重复的,势必重新随机,同时随机次数会++ 那么随机次数势必大于26次。 26次是最小的次数,基本就是不可能的,哪有随机出26个数不带一个重的,那运气太好了吧 除非说重复了以后不再重新随机,但是不再重新随机它怎么进行下一步? 不能重复实际在代码里的意思是,随机出重复以后重新随机新的字母,这不叫去重,这叫重复则不输出,并记录一次随机次数
如果你是想做一个随机字母的机智的话。。
1. 可以试着选设定出一个字母表数组。 然后 一个一个从里面取出字母 数组取完了 为空了 字母表正好筹齐, 一次也没浪费。。 哈哈哈 虽然没什么卵用
2. 百分获取法 随机0 - 1的数组 然后转化为 百分比 然后 用
x = (26{字母总字数}) - x{还存在没有被获取的字数})^2 * 百分比{随机出来的百分比} - 1
然后取 x 的自然数 当做下标 从数组里面获取
这样 次数就正好是字母总数了 也算蛮快的算法了吧。。
简直就像是狂欢一样。。。。
比如 你随机是 0.88
那么就是 88%
如果你还没取那么 算法就是
(26 - 0) * (26 - 0) / 26 * 0.88 - 1
百度下洗牌算法吧.
而且优化就算没人教.自己也改能想到吧?
最简单的就是先给定26个字母去shuffle,每次随机挑出一个数字,和最后一个元素置换,再从0-n-1的序列里随机挑选。
算法复杂度,一个循环,每次循环选择一个随机数,在做一次置换,N*随机数生成速度,空间复杂度就是原数组操作
你这样我不想看
– 暴躁的三胖 6年前记得下次用插入代码按钮试试哟。。。 !~~~
– blurs 6年前我是要得到那个次数,不是要输出26个不同的字母
– 寒兔 6年前