Javascript 从1000个元素的数组中随机抽取50个唯一元素?
从1000个元素的数组中获得50个随机唯一元素的最简单方法是什么Javascript 从1000个元素的数组中随机抽取50个唯一元素?,javascript,arrays,random,Javascript,Arrays,Random,从1000个元素的数组中获得50个随机唯一元素的最简单方法是什么 text = new Array(); for(i=0;i<1000;i++){ text[i]=i; } //array populated // now I need to get 50 random unique elements from this array. text=新数组(); 对于(i=0;iMath.random()*1000 生成50个随机数,并将其用作数组中的位置。中解释的好算法(在C中,但在J
text = new Array();
for(i=0;i<1000;i++){ text[i]=i; } //array populated
// now I need to get 50 random unique elements from this array.
text=新数组();
对于(i=0;iMath.random()*1000
生成50个随机数,并将其用作数组中的位置。中解释的好算法(在C中,但在JS中也可以轻松实现)显而易见的(对我来说)方法是洗牌数组,然后取前五十个元素。洗牌数组的方法很好,然后你可以洗牌前五十个元素。这保证了元素是唯一的
因此,使用此处的函数:
fisherYates(text);
text = text.slice(0, 50);
仔细研究一下,我想这对你很有用。如果你指的是独特的价值:
var old_arr = [0,1,2,3,4,5,6,7,8,9], new_array = [];
for (var i = 0; i < 5; i++) {
var rand_elem = old_arr[Math.floor(Math.random() * old_arr.length)];
if (arrIndex(old_arr[rand_elem], new_array) == -1) {
new_array.push(rand_elem);
} else {
i--;
}
}
function arrIndex(to_find, arr) {//own function for IE support
if (Array.prototype.indexOf) {
return arr.indexOf(to_find);
}
for (var i = 0, len = arr.length; i < len; i++) {
if (i in arr && arr[i] === to_find) {
return i;
}
}
return -1;
}
var old_arr=[0,1,2,3,4,5,6,7,8,9],new_array=[];
对于(变量i=0;i<5;i++){
var rand_elem=old_arr[Math.floor(Math.random()*old_arr.length)];
if(arrIndex(旧的arr[rand\u elem],新的arr数组)=-1){
新的数组推送(随机元素);
}否则{
我--;
}
}
函数arrIndex(to_find,arr){//支持IE的自有函数
if(Array.prototype.indexOf){
返回arr.indexOf(to_find);
}
对于(变量i=0,len=arr.length;i
如果您指的是唯一索引:
- 生成随机索引并将索引存储在数组中,并进行检查以防止重复
- 获取数组元素后开始删除它们(如果缓存长度,则可能会出现问题,因此不要)
var-arr=[];
而(平均长度<51){
var ind=Math.floor(Math.random()*1000);
如果(!(arr中的ind))
方位推力(ind)
}
数组arr中有50个随机唯一的数字,可以用作索引
编辑:
正如@ajax333221所提到的,前面的代码不能从数组中获取唯一的元素,以防它包含重复的元素。因此,这是修复方法:
var result_arr = [];
while(result_arr.length < 51){
var ind = Math.floor(Math.random()*1000);
if(text[ind] && !(text[ind] in result_arr))
result_arr.push(text[ind]);
}
var结果_arr=[];
而(结果_arr.length<51){
var ind=Math.floor(Math.random()*1000);
if(结果中的文本[ind]&&!)
结果_arr.push(文本[ind]);
}
作为“文本”,数组中填充了1000个值,这假定您指的是随机索引,而不是具有唯一值的索引
一种方法是复制数组并删除使用的数组:
function getRandomIndexes( arr, cnt){
var randomArr = [],
arrCopy = arr.slice(),
i,
randomNum ;
for (i=0;i<arrCopy.length;i++) {
randomNum = Math.floor( arrCopy.length * Math.random());
randomArr = randomArr.concat( arrCopy.splice(randomNum ,1) );
}
return randomArr;
}
var myNums = [], i, randSet;
for (i=0;i<10;i++){
myNums.push(i);
}
randSet = getRandomIndexes(myNums, 5);
函数getRandomIndexes(arr、cnt){
var randomArr=[],
arrCopy=arr.slice(),
我
随机数;
对于(i=0;我在这里做一些假设。我假设你正在检查你的随机值,就像我假设你知道如何存储这50个数字,而我不给你看:)好主意!但是,只有在1000个元素是唯一的情况下,它才能工作。@VisioN在这种情况下,请确保text
中的元素是唯一的。有很多函数可以精确地做到这一点,例如。VisioN是对的,而且洗牌1000个len数组只需花费50个周期。你是什么意思“唯一元素”指的是唯一索引或索引中的唯一值?-1 a)不能正确生成唯一编号,b)即使你修复了它,如果1k数组包含重复的唯一编号也是无用的。如果你是对的,我误解了这个问题,我只是想得到50个唯一索引编号。为什么你说它不能正确生成唯一编号???@d因为if(!(ind in arr))
不是要执行的正确检查,它检查数组中是否包含索引(不是值)。因此,如果在第一个循环中添加23,则23可能会复制接下来的22个循环。您可能希望在我第一次看到arr.slice()
时使用indexOf insteadInterest(我总是看到arr.slice(0)
),但我想它也应该起作用
function getRandomIndexes( arr, cnt){
var randomArr = [],
arrCopy = arr.slice(),
i,
randomNum ;
for (i=0;i<arrCopy.length;i++) {
randomNum = Math.floor( arrCopy.length * Math.random());
randomArr = randomArr.concat( arrCopy.splice(randomNum ,1) );
}
return randomArr;
}
var myNums = [], i, randSet;
for (i=0;i<10;i++){
myNums.push(i);
}
randSet = getRandomIndexes(myNums, 5);
function getRandomIndexes( arr, cnt){
var randomArr = [],
usedNums = {},
x;
while (randomArr.length<cnt) {
while (usedNums[x]===true || x===undefined) {
x = Math.floor( Math.random() * arr.length);
}
usedNums[x] = true;
randomArr.push( arr[x] );
}
return randomArr;
}
var myNums = [], i, randSet;
for (i=0;i<10;i++){
myNums.push(i);
}
randSet = getRandomIndexes(myNums, 5);