Maison php教程 PHP源码 根据奖品的权重值, 实现概率性随机抽取的具体实现

根据奖品的权重值, 实现概率性随机抽取的具体实现

May 26, 2016 am 08:18 AM

1、初始数据:
权重越大,抽取的几率越高
[奖品1, 权重 5], [ 奖品2, 权重6], [ 奖品3, 权重 7], [ 奖品4, 权重2]

2、处理步骤:
1)N = 5 + 6 + 7 + 2 = 20
2)然后取1-N的随机数M
3)界定各 奖品的权重范围值 奖品 1 : 1-5 ; 奖品2 : 6-11; 奖品3: 12-18; 奖品4: 19-20
4) 如果M在某个奖品的权重范围值内,标识这个奖品被抽取到


1. [代码][PHP]代码

<?php
/**
 * 奖品
 */
class Prize {
	# ID
	public $id = null;
	# 权重
	public $weight = null;
	# 奖品名
	public $name = null;

	# 权重范围区间起始值
	protected $start = 0;
	# 权重范围区间结束值
	protected $end = 0;

	public function __construct($id, $weight, $name) {
		if (!$id) {
			throw new Exception(&#39;奖品ID为空.&#39;);
		}
		$this->id = $id;
		$this->weight = $weight ? $weight : 0;
		$this->name = $name ? $name : &#39;随机奖品&#39; . $id;
	}

	# id
	public function getId() {
		return $this->id;
	}

	# 权重
	public function getWeight() {
		return $this->weight;
	}

	# 设置权重范围区间
	public function setRange($start, $end) {
		$this->start = $start;
		$this->end = $end;
	}

	# 判断随机数是否在权重范围区间
	public function inRange($num) {
		return ($num >= $this->start) && ($num <= $this->end);
	}
}

/**
 * 奖品池
 */
class PrizePoll implements IteratorAggregate, Countable {
	# 奖品集
	protected $items = array();

	# 加入奖品
	public function addItem(Prize $item) {
		$this->items[$item->getId()] = $item;
		return $this;
	}

	# 删除奖品
	public function removeItem($itemId) {
		if (isset($this->items[$itemId])) {
			unset($this->items[$itemId]);
		}
		return $this;
	}

	# 更新奖品
	public function updateItem(Prize $item) {
		if (isset($this->items[$item->getId()])) {
			$this->items[$item->getId()] = $item;
		}
		return $this;
	}

	# 获取所有奖品
	public function getItems() {
		return $this->items;
	}

	# 所有所有可用奖品(如果权重为0,说明这个奖品永远不可能抽到)
	public function getVisibleItems() {
		$items = array();
		foreach ($this->items as $item) {
			if ($item->getWeight()) {
				$items[$item->getId()] = $item;
			}
		}
		return $items;
	}

	# Countable::count
	public function count() {
		return count($this->items);
	}

	# IteratorAggregate::getIterator()
	public function getIterator() {
		return new ArrayIterator($this->items);
	}
}

/**
 * 简单的抽奖类
 */
class SimpleTurn {
	# 奖池
	protected $poll = null;
	
	public function __construct(PrizePoll $poll) {
		if ($poll) {
			$this->setPoll($poll);
		}
	}

	# 抽奖
	public function run(PrizePoll $poll) {
		$poll = $poll ? $poll : $this->poll;
		if ( ! $poll) {
			throw new Exception(&#39;奖池未初始化&#39;);
		}

		if ($poll->count() <= 0) {
			throw new Exception(&#39;奖池为空&#39;);
		}

		$items = $poll->getVisibleItems();
		if (count($items) <= 0) {
			throw new Exception(&#39;奖池为空&#39;);
		}

		$sum = 0;
		foreach ($items as $item) {
			$start = $sum + 1;
			$sum += $item->getWeight();
			$end = $sum;

			# 设置奖品的权重范围区间
			$item->setRange($start, $end);
		}

		# 随机数
		$rand = $this->getRandNum(1, $sum);

		# 区间段判断
		foreach ($items as $item) {
			if ($item->inRange($rand)) {
				return $item;
			}
		}
		return null;
	}

	# 获取随机数
	public function getRandNum($min, $max) {
		return mt_rand($min ? $min : 1, $max);
	}

	# 设置奖池
	public function setPoll(PrizePoll $poll) {
		$this->poll = $poll;
	}
}

# 示例
try {
	$prizePoll = new PrizePoll();
	$prizePoll->addItem(new Prize(1, 5))
		->addItem(new Prize(2, 6))
		->addItem(new Prize(3, 7))
		->addItem(new Prize(4, 2));

	$turn = new SimpleTurn($prizePoll);
	$prize = $turn->run();
	var_dump($prize);
} catch (Exception $e) {
	print_r($e);
}
Copier après la connexion

                   

                   

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)