The Cargo.toml in this case is sort of "advisory". When you originally built with 0.8.3 cargo automatically picked 0.8.5 for you, so updating won't change anything.
To see what's really being used, check the automatically generated Cargo.lock file.
(There is a syntax to specify an exact version in Cargo.toml, but this is frowned upon, unless you have very specific reasons to do so).
To elaborate on what @blonk means by "advisory", the rand = "0.8.3" in your Cargo.toml file tells cargo that you depend on the rand crate and want something that is compatible with 0.8.3. This "is compatible" is derived from Semantic Versioning and gives cargo enough wiggle room that cargo update will let you pick up any recent bugfixes.
The Cargo.lock file pins the exact versions of each dependency that are being used so you can have well-defined, repeatable builds[1]. When a Cargo.lock file is present, cargo build will only ever use the versions it specifies, and the only way to modify Cargo.lock is via cargo update (which updates crates to their latest semver-compatible version) or modifying the dependencies listed in Cargo.toml.
i.e. it doesn't matter whether you are building the crate on your machine or I'm building it or it's built in CI, we'll always use the same version of every crate. âŠī¸