洗牌式随机数生成器

73 阅读1分钟

洗牌式随机

传入一个数组,随机数像发牌一样进行,全部发完之后重新放入牌堆进行洗牌

  • 传入数组内容,传入后内部会自动进行洗牌
  • [1,2,3,4,5]
  • 调用next()发牌
  • 如果需要提前结束发牌,可以调用reset()
export class RandomGenerator<T> {
    private data: T[];
    private currentIndex: number;

    constructor(data: T[]) {
        this.data = [...data];
        this.shuffle(this.data);
        this.currentIndex = 0;
    }

    // 洗牌算法实现
    private shuffle(array: T[]): void {
        for (let i = array.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [array[i], array[j]] = [array[j], array[i]]; // 交换元素
        }
    }

    // 获取下一个随机数据
    public next(): T | undefined {
        if (this.currentIndex >= this.data.length) {
            this.reset();
        }
        return this.data[this.currentIndex++];
    }

    // 重置方法
    public reset(): void {
        this.shuffle(this.data);
        this.currentIndex = 0;
    }
}

使用示例

// 创建对象
const generator = new RandomGenerator([1, 2, 3, 4, 5]);

// 生成随机数据
for(let i=0;i<5;i++){
    // 输出随机数,可能是1到5中的任意一个,并且不会重复
    console.log(generator.next()); 
}

console.log(generator.next()); // 已经输出所有数据,自动重新洗牌并输出一个新的随机数

generator.reset(); // 手动重新进行洗牌继续使用