The problem was originally reported in https://github.com/bitcoin/bitcoin/issues/22450#issuecomment-880629375. This is a dedicated issue to track it independently because it is a different problem than the one reported in #22450 OP/description.

```
fuzz: addrman.cpp:149: void CAddrMan::SwapRandom(unsigned int, unsigned int): Assertion `nRndPos1 < vRandom.size() && nRndPos2 < vRandom.size()' failed.
```

To reproduce:
```sh
FUZZ=addrman_deserialize ./src/test/fuzz/fuzz /tmp/crash-ef7d4a4f940b8fdb4999f6a92969260cf8e1405f.log
```
[crash-ef7d4a4f940b8fdb4999f6a92969260cf8e1405f.log](https://github.com/bitcoin/bitcoin/files/6830072/crash-ef7d4a4f940b8fdb4999f6a92969260cf8e1405f.log)

{
    AssertLockHeld(cs);
    if (nRndPos1 == nRndPos2)
        return;
    assert(nRndPos1 < vRandom.size() && nRndPos2 < vRandom.size());
    int nId1 = vRandom[nRndPos1];
    int nId2 = vRandom[nRndPos2];
    assert(mapInfo.count(nId1) == 1);
    assert(mapInfo.count(nId2) == 1);
    mapInfo[nId1].nRandomPos = nRndPos2;
    mapInfo[nId2].nRandomPos = nRndPos1;
    vRandom[nRndPos1] = nId2;
    vRandom[nRndPos2] = nId1;
}
void CAddrMan::Delete(int nId)
{
    AssertLockHeld(cs);
    assert(mapInfo.count(nId) != 0);
    CAddrInfo& info = mapInfo[nId];
    assert(!info.fInTried);
    assert(info.nRefCount == 0);
    SwapRandom(info.nRandomPos, vRandom.size() - 1);
    vRandom.pop_back();
    mapAddr.erase(info);
    mapInfo.erase(nId);
    nNew--;
}
void CAddrMan::ClearNew(int nUBucket, int nUBucketPos)