private void AddRandomCar(Random rng) { // Try adding a car until one succeeds (adding may fail if the selected lane does not have enough free space) // Limit the number of tries, because otherwise we may loop forever (no lane may have enough space) bool added = false; int numTries = 0; while (!added && numTries++ < 2 * world.Roads.Count) { Road randomRoad = world.Roads.ToList()[rng.Next(0, world.Roads.Count)]; Lane[] lanes = rng.Next() % 2 == 0 ? randomRoad.OutLanes : randomRoad.InLanes; if (lanes.Length > 0) { VehicleParams carParams; if (rng.Next() % 4 != 0) { carParams = VehicleParams.Car; } else { carParams = VehicleParams.Truck; } Lane randomLane = lanes[rng.Next(0, lanes.Length)]; if (randomLane.FreeLaneSpace() > carParams.VehicleLength + IntelligentDriverModel.MIN_BUMPER_TO_BUMPER_DISTANCE) { // Offset to spawn the car into the lane, offset by carLength / 2 float offset = carParams.VehicleLength / (2 * randomLane.Path.Length); Vehicle car = new Vehicle(world.Cars.Count, carParams, randomLane, offset); world.AddCar(car); added = true; } } } }