How can I make enemies spawn at a random spawn point object?

I want to make it so at the start of a wave each enemy gets assigned a different premade spawn point. For example, i have 15 empty objects that are spawn points and each enemy goes to a random one when it spawns. here is my wave spawner script so far (I plan on getting rid of the “generate spawn point” class though due to that spawning enemies inside of obstacles)

[SerializeField] private float spawnRangeX;
[SerializeField] private float spawnRangeY;
[SerializeField] private float spawnRangeZ;
[SerializeField] private GameObject spawnPoint;

public TextMeshProUGUI waveCounter;
public Wave[] waves;
public int currentWaveIndex = 0;

private bool readyToCountDown;

private void Start()
{
    readyToCountDown = true;

    for (int i = 0; i < waves.Length; i++)
    {
        waves[i].enemiesLeft = waves[i].enemies.Length;
    }
}
private void Update()
{
    if (currentWaveIndex >= waves.Length)
    {
        Debug.Log("You survived every wave!");
        return;
    }

    if (readyToCountDown == true) 
    { 
        countdown -= Time.deltaTime;
    }
    

    if (countdown <= 0)
    {
        readyToCountDown = false;
        countdown = waves[currentWaveIndex].timeToNextWave;
        StartCoroutine(SpawnWave());
    }

    if (waves[currentWaveIndex].enemiesLeft == 0)
    {
        readyToCountDown=true;
        currentWaveIndex++;
    }
    if (waveCounter != null)
        waveCounter.SetText(currentWaveIndex.ToString());
}

private IEnumerator SpawnWave()
{
  if (currentWaveIndex < waves.Length)
  {
    for (int i = 0; i < waves[currentWaveIndex].enemies.Length; i++)
    {
        Enemy enemy = Instantiate(waves[currentWaveIndex].enemies[i], spawnPoint.transform);
        enemy.transform.SetParent(spawnPoint.transform);
        yield return new WaitForSeconds(waves[currentWaveIndex].timeToNextEnemy);
    }
        for (int i = 0; i < waves[currentWaveIndex].powerUps.Length; i++)
        {
            PowerUp powerup = Instantiate(waves[currentWaveIndex].powerUps[i], GenerateSpawnPosition(), transform.rotation);

            powerup.transform.SetParent(spawnPoint.transform);
        }
  }
   
}
  
private Vector3 GenerateSpawnPosition()
{
    float spawnPosX = Random.Range(-spawnRangeX, spawnRangeX);
    float spawnPosZ = Random.Range(-spawnRangeZ, spawnRangeZ);

    Vector3 randomPos = new Vector3(spawnPosX, 0, spawnPosZ);

    return randomPos;
}
[System.Serializable]
public class Wave
{
    public Enemy[] enemies;
    public float timeToNextEnemy;
    public float timeToNextWave;

    [HideInInspector] public int enemiesLeft;

    public PowerUp[] powerUps;
}

This is an example of how you could do it.

//You could also use lists, example:
//[SerializeField] private List<Transform> spawnPoints;
[SerializeField] private Transform[] spawnPoints;

[SerializeField] private GameObject prefab;

private void Start()
{
    Transform spawnPoint = GenerateSpawnPosition();

    Instantiate(prefab, spawnPoint);
}

private Transform GenerateSpawnPosition()
{
    //Edit: Forgot to add this, but if you use lists, you should change
    //spawnPoints.Lenght to spawnPoints.Count
    int i = Random.Range(0, spawnPoints.Length);

    return spawnPoints[i];
}