Source code for axelrod.strategies.rand
from axelrod.action import Action
from axelrod.player import Player
C, D = Action.C, Action.D
[docs]
class Random(Player):
"""A player who randomly chooses between cooperating and defecting.
This strategy came 15th in Axelrod's original tournament.
Names:
- Random: [Axelrod1980]_
- Lunatic: [Tzafestas2000]_
"""
name = "Random"
classifier = {
"memory_depth": 0, # Memory-one Four-Vector = (p, p, p, p)
"stochastic": True,
"long_run_time": False,
"inspects_source": False,
"manipulates_source": False,
"manipulates_state": False,
}
def __init__(self, p: float = 0.5) -> None:
"""
Parameters
----------
p, float
The probability to cooperate
Special Cases
-------------
Random(0) is equivalent to Defector
Random(1) is equivalent to Cooperator
"""
super().__init__()
self.p = p
[docs]
def strategy(self, opponent: Player) -> Action:
"""Actual strategy definition that determines player's action."""
return self._random.random_choice(self.p)
def _post_init(self):
super()._post_init()
if self.p in [0, 1]:
self.classifier["stochastic"] = False
# Avoid calls to _random, if strategy is deterministic
# by overwriting the strategy function.
if self.p <= 0:
self.strategy = self.defect
if self.p >= 1:
self.strategy = self.cooperate
@classmethod
def cooperate(cls, opponent: Player) -> Action:
return C
@classmethod
def defect(cls, opponent: Player) -> Action:
return D