ada*_*101 138
var arr = [];
while(arr.length < 8){
var r = Math.floor(Math.random() * 100) + 1;
if(arr.indexOf(r) === -1) arr.push(r);
}
console.log(arr);Run Code Online (Sandbox Code Playgroud)
ngf*_*ixl 17
另一种方法是生成一个 100 项的数组,并随机排序。这实际上导致了一个非常短且(在我看来)简单的片段。
const numbers = Array(100).fill().map((_, index) => index + 1);
numbers.sort(() => Math.random() - 0.5);
console.log(numbers.slice(0, 8));Run Code Online (Sandbox Code Playgroud)
Pra*_*are 13
生成100个数字的排列,然后连续选择.
使用Knuth Shuffle(又名Fisher-Yates shuffle)算法.
JavaScript的:
function fisherYates ( myArray,stop_count ) {
var i = myArray.length;
if ( i == 0 ) return false;
int c = 0;
while ( --i ) {
var j = Math.floor( Math.random() * ( i + 1 ) );
var tempi = myArray[i];
var tempj = myArray[j];
myArray[i] = tempj;
myArray[j] = tempi;
// Edited thanks to Frerich Raabe
c++;
if(c == stop_count)return;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
改进代码:
function fisherYates(myArray,nb_picks)
{
for (i = myArray.length-1; i > 1 ; i--)
{
var r = Math.floor(Math.random()*i);
var t = myArray[i];
myArray[i] = myArray[r];
myArray[r] = t;
}
return myArray.slice(0,nb_picks);
}
Run Code Online (Sandbox Code Playgroud)
潜在问题:
假设我们有100个数字的数组{例如[1,2,3 ... 100]},我们在8次交换后停止交换; 然后大多数时候阵列看起来像{1,2,3,76,5,6,7,8,......这里的数字将被洗牌...... 10}.
因为每个数字将以1/100的概率交换,所以概率.交换前8个数字是8/100而prob.交换其他92的是92/100.
但是如果我们运行完整数组的算法,那么我们肯定(几乎)每个条目都被交换.
否则我们会面临一个问题:选择哪8个数字?
Vic*_*inn 10
如果你想避免一个库,上面的技术很好,但是如果你对一个库有好处,我会建议你查看Chance在JavaScript中生成随机内容.
专门解决您的问题,使用Chance就像以下一样简单:
// One line!
var uniques = chance.unique(chance.natural, 8, {min: 1, max: 100});
// Print it out to the document for this snippet so we can see it in action
document.write(JSON.stringify(uniques));Run Code Online (Sandbox Code Playgroud)
<script src="http://chancejs.com/chance.min.js"></script>Run Code Online (Sandbox Code Playgroud)
免责声明,作为Chance的作者,我有点偏颇;)
为了避免任何漫长而不可靠的洗牌,我会做以下事情......
瞧 - 没有重复的数字.
如果有人感兴趣,我可以稍后发布一些实际代码.
编辑:这可能是我的竞争对手,但是,看过@Alsciende的帖子后,我无法抗拒发布我承诺的代码.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>8 unique random number between 1 and 100</title>
<script type="text/javascript" language="Javascript">
function pick(n, min, max){
var values = [], i = max;
while(i >= min) values.push(i--);
var results = [];
var maxIndex = max;
for(i=1; i <= n; i++){
maxIndex--;
var index = Math.floor(maxIndex * Math.random());
results.push(values[index]);
values[index] = values[maxIndex];
}
return results;
}
function go(){
var running = true;
do{
if(!confirm(pick(8, 1, 100).sort(function(a,b){return a - b;}))){
running = false;
}
}while(running)
}
</script>
</head>
<body>
<h1>8 unique random number between 1 and 100</h1>
<p><button onclick="go()">Click me</button> to start generating numbers.</p>
<p>When the numbers appear, click OK to generate another set, or Cancel to stop.</p>
</body>
Run Code Online (Sandbox Code Playgroud)
使用Set的现代JS解决方案(以及平均情况O(n))
const nums = new Set();
while(nums.size !== 8) {
nums.add(Math.floor(Math.random() * 100) + 1);
}
console.log([...nums]);Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
155425 次 |
| 最近记录: |