java 随机数的相关问题,求大神们帮帮忙!非常感谢! java随机数循环随机javaandroid 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单一点 用一个数组HASH已经随机过的ID,每次随机到一个数的时候 判断是否随机过就可以了。ArrayList randlist = new ArrayList();HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();public Object getRandNumber(){ //随机一个数 假如是 int num = 343434; if (!map.containsKey(num)) { //如果没取出就拿出这个数据 map.put(num,0); return num; } }提高效率的话 你可以取出一个数据的时候 把数据从list中remove掉 即可都不用判断是否已经取出方法有很多 您好,我是这样写的,你能帮我看看该怎么改过来么,下面这样肯定还是不行的。 /** * 获取随机下标(与当前下标不同) * @return */ private ArrayList<Integer> mdlist = new ArrayList<Integer>(); private int postion = 0;//下标 private int getRandomNum() { int index = 0; //先清空集合 if(mdlist.size()>0){ mdlist.clear(); } //循环播放列表获取所有歌曲的ID for (int i = 0; i < musicList.size(); i++) { mdlist.add(musicList.get(i).getId()); } //如果列表只有两首或者一首歌曲 if (musicList.size() < 2) { //index = mdlist.get(0); }else{ int did = MyApplication.getSharedPreferences();//获取当前播放的歌曲ID while (true) { index = random();//获取随机数 if(index != did){ break; } } } //设置当前播放歌曲 for (int i = 0; i < musicList.size(); i++) { if(musicList.get(i).getId()==index){ MyApplication.saveSharedPreferences(index); MyApplication.setCurrentMusic(musicList.get(i)); break; } } return index; } /**获取随机歌曲ID*/ public int random(){ postion = random.nextInt(mdlist.size());//根据集合的size来设置随机范围 return mdlist.get(postion);//返回随机歌曲ID } private ArrayList<Integer> mdlist = new ArrayList<Integer>();private int postion = 0;//下标HashMap<Integer,Integer> historyMap= new HashMap<Integer,Integer>();private int getRandomNum() { int index = 0; //先清空集合 if(mdlist.size()>0){ mdlist.clear(); } //循环播放列表获取所有歌曲的ID for (int i = 0; i < musicList.size(); i++) { mdlist.add(musicList.get(i).getId()); } //如果都取完了,重置一下 if (historyMap.size() == mdlist.size()) { historyMap.clear(); } //如果列表只有两首或者一首歌曲 if (musicList.size() < 2) { //index = mdlist.get(0); }else{ int did = MyApplication.getSharedPreferences();//获取当前播放的歌曲ID while (true) { index = random();//获取随机数 if (!historyMap.containsKey(index)) { historyMap.put(index ,index ); break; } // if(index != did){ // break; // } } } //设置当前播放歌曲 for (int i = 0; i < musicList.size(); i++) { if(musicList.get(i).getId()==index){ MyApplication.saveSharedPreferences(index); MyApplication.setCurrentMusic(musicList.get(i)); break; } } return index;} /**获取随机歌曲ID*/public int random(){ postion = random.nextInt(mdlist.size());//根据集合的size来设置随机范围 return mdlist.get(postion);//返回随机歌曲ID}你试试吧 不行,还是会有重复,这里有几点比较重要的:1,播放列表是贯穿整个项目的,假设现在的播放列表是专辑的,如果我换了歌手的歌曲,那么播放列表就会变成是歌手的。所以mdlist的集合就要清空,重新循环获取播放列表的歌曲ID来进行随机。2、如果没有切换歌手或者专辑等等,那么mdlist的数据就不变,但是就要进行移除已经被随机过的歌曲ID,避免重复随机。同时把移除的歌曲ID添加到一个新的集合里面,直到mdlist的数据都移除完了,再重新把新的集合导入mdlist里,再进行随机。 执着的妹子么,你来这里问题其实也就是百度算法嘛,本质没区别,你还不如百度,思路是这样,从一堆数组里面拿出一个数判断hashset里面是否有,没有就存入hashset,直到hashset的size和之前的一样,不过这样的算法冗余度较长 Dialog SDK位置 关于ProgressDialog的问题 如何实现滑动控件 为何自动生成main.out.xml cygwin bash: make: command not found 一个activity,两个layout,source not found String比较大小问题 求 android下非ROOT读取USB设备文件的方法 如何防止apk被卸载 Handler问题 如何加载和保存短信草稿 日期格式化:2015-02-6怎么格式化为2015-02-06?望解决。
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();public Object getRandNumber(){
//随机一个数
假如是 int num = 343434; if (!map.containsKey(num)) { //如果没取出就拿出这个数据
map.put(num,0);
return num;
}
}
提高效率的话 你可以取出一个数据的时候 把数据从list中remove掉 即可都不用判断是否已经取出
方法有很多
* 获取随机下标(与当前下标不同)
* @return
*/
private ArrayList<Integer> mdlist = new ArrayList<Integer>();
private int postion = 0;//下标
private int getRandomNum() {
int index = 0;
//先清空集合
if(mdlist.size()>0){
mdlist.clear();
}
//循环播放列表获取所有歌曲的ID
for (int i = 0; i < musicList.size(); i++) {
mdlist.add(musicList.get(i).getId());
}
//如果列表只有两首或者一首歌曲
if (musicList.size() < 2) {
//index = mdlist.get(0);
}else{
int did = MyApplication.getSharedPreferences();//获取当前播放的歌曲ID
while (true) {
index = random();//获取随机数
if(index != did){
break;
}
}
}
//设置当前播放歌曲
for (int i = 0; i < musicList.size(); i++) {
if(musicList.get(i).getId()==index){
MyApplication.saveSharedPreferences(index);
MyApplication.setCurrentMusic(musicList.get(i));
break;
}
}
return index;
}
/**获取随机歌曲ID*/
public int random(){
postion = random.nextInt(mdlist.size());//根据集合的size来设置随机范围
return mdlist.get(postion);//返回随机歌曲ID
}
private ArrayList<Integer> mdlist = new ArrayList<Integer>();
private int postion = 0;//下标
HashMap<Integer,Integer> historyMap= new HashMap<Integer,Integer>();private int getRandomNum() {
int index = 0;
//先清空集合
if(mdlist.size()>0){
mdlist.clear();
} //循环播放列表获取所有歌曲的ID
for (int i = 0; i < musicList.size(); i++) {
mdlist.add(musicList.get(i).getId());
} //如果都取完了,重置一下
if (historyMap.size() == mdlist.size()) {
historyMap.clear();
}
//如果列表只有两首或者一首歌曲
if (musicList.size() < 2) {
//index = mdlist.get(0);
}else{
int did = MyApplication.getSharedPreferences();//获取当前播放的歌曲ID
while (true) {
index = random();//获取随机数
if (!historyMap.containsKey(index)) {
historyMap.put(index ,index );
break;
}
// if(index != did){
// break;
// }
}
}
//设置当前播放歌曲
for (int i = 0; i < musicList.size(); i++) {
if(musicList.get(i).getId()==index){
MyApplication.saveSharedPreferences(index);
MyApplication.setCurrentMusic(musicList.get(i));
break;
}
}
return index;
}
/**获取随机歌曲ID*/
public int random(){
postion = random.nextInt(mdlist.size());//根据集合的size来设置随机范围
return mdlist.get(postion);//返回随机歌曲ID
}你试试吧
不行,还是会有重复,这里有几点比较重要的:
1,播放列表是贯穿整个项目的,假设现在的播放列表是专辑的,如果我换了歌手的歌曲,那么播放列表就会变成是歌手的。所以mdlist的集合就要清空,重新循环获取播放列表的歌曲ID来进行随机。
2、如果没有切换歌手或者专辑等等,那么mdlist的数据就不变,但是就要进行移除已经被随机过的歌曲ID,避免重复随机。同时把移除的歌曲ID添加到一个新的集合里面,直到mdlist的数据都移除完了,再重新把新的集合导入mdlist里,再进行随机。