【GDScript】很FAST的带权值随机工具类

extends Node

## 键为随机物品,值为对应的权值,暂时不支持小数(提示:可以用类似链表解决哈希冲突方法实现)
@export var item_chance_map : Dictionary = {
	"a" : 1,
	"b" : 5,
	"c" : 50,
	"d" : 55
}

## 哈希空间
var hash_item_map : Dictionary

func _ready() -> void:
	initiate_chance_hash()
	
	## 测试代码,随机10000次
	var item_count = {}
	for i in 10000:
		var rand_item = roll_for_item()
		if item_count.has(rand_item):
			item_count[rand_item] = item_count[rand_item] + 1
		else:
			item_count[rand_item] = 0

	print(item_count)


## 关键代码1:往哈希空间里扔飞镖
func roll_for_item():
	return hash_item_map[randi() % hash_item_map.size()]


## 关键代码2:按照权值大小往哈希空间里划分地盘
func initiate_chance_hash():
	hash_item_map.clear()

	var hash_index = 0
	for item in item_chance_map.keys():
		## 作业:在这里实现小数点支持(虽然小数点没有性能优势)
		var hash_space = floor(item_chance_map.get(item))
		## 划分哈希地盘
		for i in hash_space:
			hash_item_map[hash_index] = item
			hash_index += 1

======= 测试===================

参数:
在这里插入图片描述
(注意直接打印dictionary是乱序的)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值