npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@lazy-random/array-algorithm

v2.0.1

Published

陣列隨機演算法 (Random Algorithm) 工具集:洗牌 (Shuffle) 與數值區間重分布 (Rebase) 等功能

Readme

@lazy-random/array-algorithm

與陣列 (Array) 相關的隨機演算法 (Random Algorithm) 工具集,提供洗牌 (Shuffle) 與數值區間重分布 (Rebase) 等功能。

特色 (Features)

  • swapAlgorithm / swapAlgorithm2:以交換方式打亂陣列順序(Fisher–Yates 風格的洗牌演算法)
  • 支援選擇「就地修改 (In-Place)」或「回傳副本 (Copy)」
  • 洗牌用的隨機索引 (Random Index) 可自訂,方便替換為具種子 (Seed) 的偽隨機數生成器 (PRNG)
  • array_rebase:將數值陣列整體平移,並可檢查是否仍落在指定區間 (Interval) 內
  • 支援 TypeScript 型別宣告 (Type Declarations)

安裝 (Installation)

yarn add @lazy-random/array-algorithm
yarn-tool add @lazy-random/array-algorithm
yt add @lazy-random/array-algorithm

使用方式 (Usage)

CommonJS

const { swapAlgorithm, swapAlgorithm2, array_rebase } = require('@lazy-random/array-algorithm');

ESM

import { swapAlgorithm, swapAlgorithm2, array_rebase } from '@lazy-random/array-algorithm';

範例 (Examples)

const arr = [1, 2, 3, 4, 5];

// 回傳副本,不修改原陣列
const shuffled = swapAlgorithm(arr, false);
console.log(shuffled);

// 就地修改 (In-Place),直接改寫原陣列
swapAlgorithm(arr, true);
// 將陣列內每個數值加上 n_diff,並檢查是否仍在 [min, max] 區間內
const ret_b = [1, 2, 3];
const { bool, b_sum } = array_rebase(ret_b, 1, 0, 5);

console.log(bool);  // true:所有元素仍在區間內
console.log(b_sum); // 轉換後的總和
console.log(ret_b); // 每個元素都已加上 n_diff

API 文件 (API Reference)

swapAlgorithm(arr, overwrite?, fn?): any

以交換方式打亂陣列的洗牌 (Shuffle) 演算法。迴圈由陣列尾端往前,每次取得一個隨機索引並與目前位置交換。

| 參數 (Parameter) | 型別 (Type) | 預設值 (Default) | 說明 (Description) | | --- | --- | --- | --- | | arr | T extends IArrayInput02<any> | — | 要打亂的陣列 | | overwrite | boolean | false | true 時就地修改 (In-Place) 原陣列;false 時先複製一份再處理 | | fn | (n: number, ...argv: any[]) => number | arrayRandIndexByLength | 產生隨機索引的函式,輸入上界 n、回傳 0–n-1 的索引 |

  • 回傳 (Returns):打亂後的陣列(overwrite 為 false 時是原陣列的副本 (Copy))

swapAlgorithm2(arr, overwrite?, fn?): T

swapAlgorithm 的變體 (Variant),差異在於交換索引的產生方式:

  • 迴圈內一律以「完整長度 len」呼叫 fn,且當隨機索引恰好等於目前索引時,會依目前位置位於前半段或後半段,再以 fn(len) 或 fn(i) 重新取樣一次,藉此降低「位置未變動」的機率。
  • 第二個參數與第三個參數的意義與 swapAlgorithm 相同。

| 參數 (Parameter) | 型別 (Type) | 預設值 (Default) | 說明 (Description) | | --- | --- | --- | --- | | arr | T extends IArrayInput02<any> | — | 要打亂的陣列 | | overwrite | boolean | false | true 時就地修改原陣列 | | fn | (n: number, ...argv: any[]) => number | arrayRandIndexByLength | 產生隨機索引的函式 |

  • 回傳 (Returns):T — 打亂後的陣列

array_rebase(ret_b, n_diff, min, max)

將 ret_b 中的每個數值加上 n_diff(即平移至新的區間,back to original interval),可選擇是否檢查平移後的值是否仍落在 [min, max] 之內。

| 參數 (Parameter) | 型別 (Type) | 說明 (Description) | | --- | --- | --- | | ret_b | number[] | 要平移的數值陣列(會被就地修改) | | n_diff | number | 每個元素要加上的差值 | | min | number | 區間下界;與 max 皆非 number 型別時略過檢查 | | max | number | 區間上界;與 min 皆非 number 型別時略過檢查 |

  • 回傳 (Returns):{ bool: boolean, b_sum: number }
    • bool:true 表示所有元素平移後仍在區間內(或略過了檢查);false 表示有元素超出區間,此時迴圈已中斷 (Break)。
    • b_sum:平移後已寫回元素的總和。

注意 (Note):min / max 的判斷採 typeof === 'number',因此只要其中一個是 number 就會進行區間檢查。檢查由陣列尾端往前進行,一旦某個元素超出 [min, max] 就會中斷,該元素與其前方(索引較小)的元素都不會被寫回,b_sum 也只累計到中斷前已成功平移的元素。

開發 (Development)

pnpm run build
pnpm run test:jest
pnpm run lint

變更日誌 (Changelog)

詳見 CHANGELOG.md。

FAQ

swapAlgorithm 與 swapAlgorithm2 該用哪一個?

一般洗牌請使用 swapAlgorithm;若希望降低「元素留在原位置」的機率、或需要以完整長度為基準取樣,可改用 swapAlgorithm2。

為什麼 array_rebase 回傳的 b_sum 可能不完整?

當啟用區間檢查且某個元素平移後超出 [min, max] 時,函式會立即中斷 (Break),該元素與其前方(索引較小)的元素都不會被寫入與累加,因此 b_sum 僅代表「中斷前已成功平移的部分總和」。

相關資源 (Related Resources)