洗牌式随机
传入一个数组,随机数像发牌一样进行,全部发完之后重新放入牌堆进行洗牌
- 传入数组内容,传入后内部会自动进行洗牌
- 例
[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(); // 手动重新进行洗牌继续使用