You could modify option 2 to avoid magic numbers and also avoid the problem of passing a person id for the action parameter or vice versa:
struct Person
{
explicit Person(int x) : id (x) {}
int id;
static Person ALL;
};
Person Person::ALL(0);
struct Action
{
explicit Action(int x) : id (x) {}
int id;
static Action ALL;
};
Action Action::ALL(0);
int getNumberofEvents(const Person& person, const Action& action, float param1);
// ...
int count = getNumberOfEvents(Person(3), Action::ALL, 1.0f);