算法的平均时间复杂度为O(nlogn)。但是当输入是已经排序的数组或几乎排好序的输入,时间复杂度却为O(n^2)。为解决这一问题并保证平均时间复杂度为O(nlogn)的方法是引入预处理步骤,它惟一的目的是改变元素的顺序使之随机排序。这种预处理步骤可在O(n)时间内运行。能够起到同样作用的另一种简单方法是在算法中引入一个随机元素,这可以通过随机地选择拆分元素的主元来实现。随机选择主元的结果放宽了关于输入元素的所有排列的可能性相同的步骤。引入这一步来修正原先的快速排序,可得到下面所示的随机化快速排序。新算法只是在区间[low…high]中一致随机地选择一个索引v,并将A[v]和A[low]交换,然后按照原来的快速排序算法继续。这里,parseInt(Math.random()*(high-low+1)
+
low)返回一个在low和high之间的数。
复制代码
代码如下:
/****************************************
算法:split
输入:数组A[low...high]
输出:
1.若有必要,输出按上述描述的重新排列的数组A;
2.划分元素A[low]的新位置w;
****************************************/
function
split(array,
low,
high)
{
var
i
=
low;
var
x
=
array[low];
for(var
j
=
low
+
1;
j
<=
high;
j++)
{
if(array[j]
<=
x)
{
i
++;
if(i
!=
j)
{
var
temp
=
array[i];
array[i]
=
array[j];
array[j]
=
temp;
}
}
}
temp
=
array[low];
array[low]
=
array[i];
array[i]
=
temp;
return
i;
}
/****************************************
算法:rquicksort
输入:A[0...n-1]
输出:按非降序排列数组A[0...n-1]
rquicksort(A,
0,
n-1);
****************************************/
function
rquicksort(array,
low,
high)
{
if(low
<
high)
{
/******随机化拆分元素的主元*******/
var
v
=
parseInt(Math.random()*(high-low+1)
+
low);
var
tmp
=
array[low];
array[low]
=
array[v];
array[v]
=
tmp;
/******随机化拆分元素的主元*******/
var
w
=
split(array,
low,
high);
rquicksort(array,
low,
w
-1);
rquicksort(array,
w
+1,
high);
return
array;
}
}
var
array
=
[33,
22,
11,
88,
23,
32];
array
=
rquicksort(array,
0,
array.length-1);
console.log(array);
❷ 用js如何实现随机返回数组的一个元素
vara=[1,2,3,3,4,5,6,7,8,9];
functionsendNum(arr)
{
returnarr[Math.floor(Math.random()*arr.length)];
}
sendNum(a);
这样就可以实现每次返回是一个随机数组中的一个数。版主要权用的就是random的方法。random方法,是返回(0,1]的数,但取不到1,所以用Math.floor向下取整。
❸ 怎么用js从一个数组中随机取出5个元素
用随机数产生函数啊,rand(),可以先用时间函数产生一个种子,
#include<stdlib.h>
#include<time.h>
srand(time(null));
i=rand();
然后
i
就可以作为数组的内下标容了,根据数组的实际长度,可以利用rand()%x
(其中x是数组的长度)来限定
i
的取值范围
❹ JS生成不重复的随机数组的简单实例
JS生成不重复的随机数组的简单实例
//获取数组中的随机数
//HF.Math.RandomNumbers是前缀,可以自己定义,主要看逻辑代码
HF.Math.RandomNumbers
=
function
(startNum,
endNum,
count,
repeat)
{
var
ret
=
[];
if
(repeat)
{
for
(var
i
=
0;
i
<
count;
i++)
{
ret[i]
=
HF.Math.Random(startNum,
endNum);
}
return
ret;
}
var
tmp
=
[];
var
i
=
0;
for
(var
s
=
startNum;
s
<=
endNum;
s++)
{
tmp[i++]
=
s;
}
var
l
=
tmp.length;
for
(i
=
0;
i
<
count;
i++)
{
ret[i]
=
HF.Array.Remove(tmp,
HF.Math.Random(0,
--l));
}
return
ret;
}
以上这篇JS生成不重复的随机数组的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
❺ JS 如何将 数组的 内容 重新 随机排列 比如 array 里面是 1, 2,3 , 4 然后 随便重新放入数组3214 4321
<script>
vararr=[1,2,3,4];
arr.sort(function(){return0.5-Math.random()});
alert(arr);
</script>
❻ 用JS实现随机生成10个1-1100之间的不重复的整数存放在数组中,并由用户输入一个数判断是否在该
这是我以前写的,封装成独立函数,那个ran()是主要的,不过可能写得会有点乱,但是用是ok的,
"use strict";
var random, arr = [], random_oo, oo = 0;
var r, a = 1, b = 1, c, n, num, k, result, m;
/**
* 生成min到max之间的随机整数并返回。
* @param min
* @param max
* @returns {number}
*/
function ran_sc(min, max) {
random = Math.round(Math.random() * (max - min)) + min;
return random;
}
/**
* 生成唯一随机数需要,检测当前随机数与数组内所有数字重复情况。
* @param x 随机数
* @returns {number} 重复情况
* 唯一(数组内所有数字没有和x重复,返回0;
* 有重复,返回1。
*/
function csqian(x) {
oo = 0;
for (var l = 0; l < arr.length; l++) {
if (x === arr[l]) oo = 1;
}
return oo;
}
/**
* 主调用函数。
* @param min 最小值
* @param max 最大值
* @param zushu 组数,要生成随机数的个数。
* @param chong_fu 是否重复,随便生成为true,生成唯一为false、
* @returns {Array} 随机数数组
*/
function ran(min, max, zushu, chong_fu) {
arr = [];
if (chong_fu === true) {//随便
random = arrran(min, max, zushu);
return random;
} else if (chong_fu === false) {//唯一
random = arrran_oo(min, max, zushu);
return random;
}
}
/**
* 随便生成
* @param min
* @param max
* @param zushu
* @returns {Array}
*/
function arrran(min, max, zushu) {
for (var i = 0; i <= (zushu - 1); i++) {
arr[i] = ran_sc(min, max);
}
return arr;
}
/**
* 生成唯一随机数函数的判断选择。。
* @param min
* @param max
* @param zushu
* @returns {Array}
*/
function arrran_oo(min, max, zushu) {
if (zushu > (max - min + 1)) {
console.log(min);
console.log(max);
console.log(zushu);
alert("组数应不超过能生成的所有不一样的随机数的数目\n(即组数不超过(最大值-最小值+1))");
} else {
random = c_s(min, max, zushu);
return random;
}
}
/**
* 生成唯一随机数
* @param min
* @param max
* @param zushu 组数
* @returns {Array}
*/
function c_s(min, max, zushu) {
for (m = 0; m <= Infinity; m++) {
if (m === zushu) break;
random_oo = ran_sc(min, max);
if (csqian(random_oo) === 0) {
arr[m] = random_oo;
} else if (csqian(random_oo) === 1) {
random_oo = ran_sc(min, max);
m -= 1;
}
}
return arr;
}
var r_ = ran(1, 1100, 10, false);
let INum = 0;//这里是用户输入的数
let EP = -1;
for (let i = 0; i < r_.length; ++i) {
if (r_[i] === INum) EP = i;
}
console.log("输入的数: " + INum);
console.log("生成随机数结果: " + r_.toString());
console.log("结果: " + EP);
❼ js随机数组问题
varallComponents=[],goodComponents=[],badComponents=[];
for(vari=0;i<3000;i++){
if(Math.random()<0.5){
allComponents.push("good");
goodComponents.push(i);
}else{
allComponents.push("bad");
badComponents.push(i);
}
}
其中allComponents中储存的是零件的好坏标识,比如内 ["good", "bad", "good"...]
goodComponents储存的是好零件在容allComponents中的序号,比如 [0, 2...]
badComponents储存的则是坏零件在allComponents中的序号,比如 [1, ...]
另外,你题目中有一处是自我矛盾的,前面说“只知道好的零件比坏的零件多”,后面又说“生成好的零件和坏的零件概率一致”,这个怎么解释?
❽ js如何生成指定范围内的随机数
function getArrayItems(arr, num) { //新建一个数组,将传入的数组复制过来,用于运算,而不要直接操作传入的数组; var temp_array = new Array(); for (var index in arr) { temp_array.push(arr[index]); } //剔除一些数字//取出的数值项,保存在此数组 var return_array = new Array(); for (var i = 0; i//判断如果数组还有可以取出的元素,以防下标越界 if (temp_array.length>0) { //在数组中产生一个随机索引 var arrIndex = Math.floor(Math.random()*temp_array.length); //将此随机索引的对应的数组元素值复制出来 return_array[i] = temp_array[arrIndex]; //然后删掉此索引的数组元素,这时候temp_array变为新的数组 temp_array.splice(arrIndex, 1); } else { //数组中数据项取完后,退出循环,比如数组本来只有10项,但要求取出20项. break; } } return return_array; }var my_array = new Array(); for (i = min; i < max; i++) //max,min指定范围{ my_array[i] = i; } my_array = getArrayItems(my_array,1000); //得到数组 function rand(u,d){ ++d; return parseInt(Math.random()*(u-d)+d); }