15
回答
怎么实现随机1-9?
终于搞明白,存储TCO原来是这样算的>>>   
就是在1-9中随机,如果第一个数是2,那么下一个随机数不能再是2,只有在1-9都出现之后,下次才可以从来,怎么写?要最爽的方法
<无标签>
举报
vcxiaohan
发帖于2年前 15回/742阅
共有15个答案 最后回答: 2年前
看到别人的算法,1-9顺序排列在数组中,随机取出数组一个数并与数组最后一个数交换,下次在前8个数里随机,循环

最酸爽的方法, 对1~9进行随机保存到数组中, 请求一个,就从数组中取走一个。最后9个都取完了,就再重新随机一次,然后再放到数字中。

上面过程可以用队列或栈来实现。


酱紫:

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Integer> list = rand();
        System.out.println(list);
    }

    public static List<Integer> rand() {
        final Integer[] EXISTED = new Integer[9];
        int successCount = 0;
        List<Integer> numbers = new ArrayList<>(); // output
        while (successCount < 9) {
            int rand = (int) (Math.random() * 10 % 9 + 1); // 1-9
            Integer value = EXISTED[rand - 1]; // bound 0-8
            if (value == null) {
                EXISTED[rand - 1] = rand;
                successCount += 1;
                numbers.add(rand);
            }
        }
        return numbers;
    }
}



--- 共有 1 条评论 ---
vcxiaohan有js的吗 2年前 回复

引用来自“无脑仔的小明”的评论

最酸爽的方法, 对1~9进行随机保存到数组中, 请求一个,就从数组中取走一个。最后9个都取完了,就再重新随机一次,然后再放到数字中。

上面过程可以用队列或栈来实现。



想了我好久,o(︶︿︶)o 唉。。有没有更酷的方法,求实现一下

function getRandomNum(len) {

var arrA = [];
var arrX = [];
var arr = [];
for(var m=0; m<len; m++) {
var res = false;
var ran = Math.ceil(Math.random()*len);


while(!res) {
var x = 1;


console.log('ran'+ran);
for(var i=0; i<arrA.length; i++) {
if(ran != arrA[i]) {
arrX[i] = 1;
}else {
arrX[i] = 0;
}
}


console.log('arrX'+arrX);
for(var j=0; j<arrX.length; j++) {
x *= arrX[j];
}
if(x) {
res = true;
arrA.push(ran);
console.log('a');
}else {
ran = Math.ceil(Math.random()*len);
console.log('b');


}


}
}
return arrA;
}

console.log(getRandomNum(20));

JS其实和Java差不多的。

function rand() {
  var EXISTED = [null,null,null,null,null,null,null,null,null];
  var successCount = 0;
  var numbers = new Array();
  while(successCount < 9) {
    var rand = Math.floor( Math.random() * 10 % 9 + 1 ); // 正确的@!
    var value = EXISTED[rand - 1];
    if(value == null) {
      EXISTED[rand - 1] = rand;
      successCount += 1;
      numbers.push(rand);
    }
  }
  return numbers;
}
// run test
var numbers = rand();
console.debug(numbers.join(','));



--- 共有 1 条评论 ---
蓝水晶飞机Math.round() 函数不可以, 请改为Math.ceil( Math.random() * 10 % 9 + 1 ); 否则都产生出10 的数字了。 2年前 回复
var _col=[1,2,3,4,5,6,7,8,9];
function main() {
	var list = _col.concat();
	var total = 20;
	for(var i = 0; i < total; i++) {
		if(list.length == 0) {
			list = _col.concat();
		}
		var num = Math.floor(Math.random()*list.length);
		console.log(list[num]);
		list.splice(num,1);
		console.log(list);
	}
}


一个数组搞定
思路,做个通用的方法,这个方法返回一个min到max的连续数组,然后另外一个方法是随机产生一个min到max的随机数的数组,然后两个方法组合使用,根据连续数组的长度随机出一个数,从这个数组里面取出来并且删除数组里面的相应项。这个一般在游戏开发里面都做成通用方法了,经常用到
各位说的都好,我就补充一点,这个随机不必每次都跑一遍,没意义。数组打乱一次,然后每一次单纯出栈即可。
--- 共有 1 条评论 ---
sxgkwei云。 2年前 回复
顶部