考慮到效能問題,如何快速從乙個巨大的陣列中隨機獲取部分元素。
比如有個陣列有100w個元素,從中不重複隨機選取10w個元素
生成量為100w大陣列
快速生成乙個巨大陣列 使用array.from()let defarr =
newarray
(1000000
)for
(let i =
0; i < defarr.length; i++
) defarr[i]
= i
通過set特性,存放隨機數,這裡需要注意的是,沒有就add,有就遞迴,總之要保證遍歷的每一項都要找到乙個唯一隨機值,如果有就跳過就不能保證最後能獲取到10k個值。
取乙個隨機數,按 (總數/採點個數 + 隨機數) 的方式取值const
randomnumhandle
=(arr, randomnum)
=>
,(v, i)
=> i)
;let resultset =
newset()
// 快速選取randomnum個元素
for(
let i =
0; i < randomnum; i++
)function
addnum()
else
}return array.
from
(resultset)
} console.
time
('a'
) console.
log(
randomnumhandle
(defarr,
100000))
console.
timeend
('a'
)// a: 117.224853515625ms
1.生成乙個0 - arr.length 的隨機數function
randomnum
(arr, randomnum)
return result
} console.
time
('b'
) console.
log(
randomnum
(defarr,
100000))
console.
timeend
('b'
)// b: 10.064208984375ms
2.交換該隨機數字置元素和陣列的最後乙個元素,並把該隨機位置的元素放入結果陣列
3.迴圈生成乙個0 - arr.length - 1 的隨機數
4.交換該隨機數字置元素和陣列的倒數第二個元素,並把該隨機位置的元素放入結果陣列
依次類推,直至取完所需的10k個元素
個人推薦使用 洗牌演算法,如場景需要 統計學隨機取樣點演算法也很不錯哦function
shuffle
(arr,size)
return result
} console.
time
('c'
) console.
log(
shuffle
(defarr,
100000))
console.
timeend
('c'
)// c: 21.2099609375ms
隨機取陣列,打亂陣列元素
隨機取陣列元素 dim xuan xuan openfile xuan.txt xuan split xuan,function rndint byval maxnum,byval minnum asp生成整數之間的隨機數函式 dim tmp if maxnum tmp minnum minnum ...
複製拼接陣列,取陣列指定部分
1 skip take 該方法速度比較慢,在迴圈中使用效率低 int bt int arr bt.skip 2 take 3 toarray 取陣列bt指定索引 2 後指定個數 3 包括索引 的元素,即取第3個到第6個元素值陣列arr 2 array.copy 在迴圈中使用效率高 int a new...
python 從陣列隨機取資料
在神經網路中,經常會用到批量樣本訓練。我們需要從陣列隨機取資料,主要有以下幾種方法 1 np.random.shuffle 將原陣列打亂 import numpy as np array np.random.randint 1,100,size 10 63 32 80 33 61 45 28 55 ...