Why do we pronounce “one” and “won” the same way? After all, they are not remotely the same word!
To take the latter first, there is some instability in the pronunciation of the letter <o>, particularly before a nasal (typically <n> or <m>); it is frequently pronounced as if it were <u>. This is partly because it is only recently that (British) English moved to lip rounding on the letter <o> (even old Pathé news clips will show this lacking, as remains the case in American), so <o> and <u> were once more similar. The other reason, bizarrely, is simply orthography – some calligraphers did not like to write <u> before <n> or <m> because it could run together and become unclear, so they switched to <o>. The winning version in Standard Written English was chosen almost at random – hence we have “win-won” but “sing-sung”; and “son” and “sun” are pronounced identically. It was not completely random, etymology also had something to do with it – hence, for example, “London”.
What about “one”, why is it pronounced the same way?
Until the fifteenth century across England, and indeed later in most English-speaking areas, “one” was pronounced as you would expect, to rhyme with “stone” and close to modern southern English “own”. Of course, this remains in related words such as “only”, “(a)lone(ly)” and even in fact “atone”. Modern Scots does pronounce the direct equivalent ane “one” (cf. stane “stone”) as you would expect (Scots actually has a “y-glide” in such circumstances, thus it sounds like “yin”, but this is entirely predictable); and of course Dutch has een (cf. steen “stone”) and German has ein (cf. Stein).
So what happened to make English the lone (ahem) exception?
Well, nobody knows! Some things in language are just mysterious. This is just, well, one…