Wouldn't object identity be a much more useful notion to identify a citizen rather than some number
Of course you are right. Only object pointers are saved. Thus the term "integer" is wrong. Sorry for that. [But object references (pointers) also have a size of 32 bit (or 64 bit on 64 bit systems).]
I have a bit of trouble seeing a work identifier and a flat identifier as being unrelated to each other however
Why should there be a relation between the citizen's flat and the citizen's factory/office?
The notion that every citizen has a car made me smile
Every citizen CAN save a car pointer. That doesn't mean that every citizen really has a car. To get accurate: Pupils and students wont own cars in P1SIM. All others do. But having a car doesn't mean always using car. Check out real life. If someone has a car, that does not mean, that s/he does not use public transport.
Obviously, there is no need to store the properties in such a case, as it is duplicate information (that is, given a seed, I can compute the properties at any time).
In general you are right. But in some cases it could be clever to store the calculated values.
Also, the normal approach with seeds is to initialize a random number generator one time (upon game start) with a seed, and then use that one generator for generating all values for all citizens (and all other things you want to have randomized).
I coded a random generator on my own. It always outputs the same number y when inputting the same number x. That way I can easily ask my "random generator": "Which shirt color does the citizen 45923 have?" And the generator will always output "green". [It will output an integer value which I translate to the color value]
That way I dont have to store the characteristics of a special citizen: Shirt color, car color, being price or comfort-orientated traveller, profession, gender, age etc. can be calculated in real time.