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)

if (info.nRefCount >= ADDRMAN_NEW_BUCKETS_PER_ADDRESS) continue;
            int bucket_position = info.GetBucketPosition(nKey, true, bucket);
            if (restore_bucketing && vvNew[bucket][bucket_position] == -1) {
                
                vvNew[bucket][bucket_position] = entry_index;
                ++info.nRefCount;
            } else {
                
                
                bucket = info.GetNewBucket(nKey, m_asmap);
                bucket_position = info.GetBucketPosition(nKey, true, bucket);
                if (vvNew[bucket][bucket_position] == -1) {
                    vvNew[bucket][bucket_position] = entry_index;
                    ++info.nRefCount;
                }
            }
        }
        
        int nLostUnk = 0;
        for (auto it = mapInfo.cbegin(); it != mapInfo.cend(); ) {
            if (it->second.fInTried == false && it->second.nRefCount == 0) {
                const auto itCopy = it++;
                Delete(itCopy->first);
                ++nLostUnk;
            } else {
                ++it;
            }
        }
        if (nLost + nLostUnk > 0) {