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;
                    }
                }
            }
        }