public Decision chooseDecision(State s) {
			if (!strategic)
				return Util.sample(s.allPossibleDecisions(), random);
			
			PlayerState ps = s.currentPlayerState();
			Set<Decision> ds = new LinkedHashSet<Decision>(50);
			if (ps.drawn_card != null) {
				ds = DrawCardDecision.availableTo(s, ps, ds);
			} else if (ps.drawn_missions != null) {
				ds = KeepMissionsDecision.availableTo(s, ps, ds);
			} else {
				// endpoints for probability integral
				double dcd_end = 2 * Util.logsig(-ps.hand.size() * alpha),
				       crd_end = 0.995;

				while (ds.isEmpty()) {
					double x = random.nextDouble();
					if (x < dcd_end) {
						ds = DrawCardDecision.availableTo(s, ps, ds);
						if (ds.isEmpty())
							dcd_end = 0;
					} else if (x < crd_end) {
						ds = ClaimRailwayDecision.availableTo(s, ps, ds);
						if (ds.isEmpty())
							crd_end = 0; // i guess...
					} else {
						ds = DrawMissionsDecision.availableTo(s, ps, ds);
					}
				}
			}
			return sample(ds, s);
		}