Well, there are a number of ways to do this. The best way I can think of, that allows for camps to be interesting and varied and to be location-specific is to manually place a large number of camps and delete all but a few of them at run time:
// Create lots of potential camps and place a gamelogic in the centre of each one.
// Pass the names of those gamelogics
// through into the function, along with how many camps should be left at the end.
//
// Run with:
// camps = [camp1, camp2, camp3, camp4];
// // Just want 2 camps to remain in the game.
// [camps, 2, 10] execVM "deleteCamps.sqf";
// // camps will then contain the logics that at at the position of the camps that are left,
// // as well as some objNulls, so you can easily see where the camps remain and so
// // do more processing, for example, setting them as objectives.
_camps = _this select 0; // List of gameLogics
_numCampsToLeave = _this select 1; // How many should be left after deletion.
_radius = _this select 2; // How far out from the game-logic to delete things.
while { (count _camps) > _numCampsToLeave } do
{
// Choose a random camp from the list.
_campToDelete = _camps select (floor (random (count _camps)));
// Delete all objects near the camp logic (including that logic).
{
deleteVehicle _x;
} forEach (nearestObjects [_campToDelete, ["All"], _radius]);
// Delete the deleted camp "logic" from the list.
_camps = _camps - [objNull];
};
Warning: Untested code...