The reason why random access operations are worse as compared to sequential operations is hidden in the structure of the B-Trees. A B-Tree node typically contains a set of records. And each B-tree node represents an actual disk block of your non-volatile storage. So basically, if you're trying to read random records, it is highly likely they're stored in different nodes (i.e., different blocks), and you'll have to make as many disk IOs. On the other hand, in the case of sequential access, the records tend to be present in the same blocks, so you'll have a lesser number of blocks to make IO to.
On a side note, it turns out that when we talk about pure B-Trees, they store even sequential records in a rather random manner and hence pose performance issues. This problem is solved by B+ Trees, which tend to store sequential records sequentially in the leaf nodes, which are connected with each other like a linked-list.