Can you get the .lst file? I guess you have tried 'CTRL+F food', but if not it could be worth a look.
I don't know for sure, but if it's based on a simple 'N times in M, the generated item is food' or 'N times in M, the generated vault is a food vault', then statistics dictates that it's always *possible*, just very unlikely, that the roll 'N in M' fails M or more times in a row.
To be a little more concrete, a 50% fail rate spell should fail roughly ..50% of the time, but it's always possible that, say, you fail to cast it 20 times in a row, because that chance remains the same for each roll: there's a 50% chance of each *individual* roll failing, no matter how many rolls have already been done. If you flip a coin 20 times and it comes up heads every time, that doesn't necessarily mean there's anything wrong with the coin or your flipping, you just encountered an event of very low probability.
The above type of roll is the type used in most of Crawl. If in this case, it instead uses a 'Count the number of items generated, and for every Nth item, *make it a food item*', then it's not statistically vulnerable in the way I described. This is a more controlled method where you can limit the amount of variance pretty precisely.
For example, some games will use a variant of this, where they randomly generate a 'number of turns/items until next foo event' counter every time said counter reaches zero, after actually generating the event of course. The most well known being Bubble Bobble.
Personally I'd prefer the second method, as a player, because I know it's more reliable/controllable, both from the inside and outside of the algorithm.
</statistics is fun>
Just to be clear, I haven't yet looked at the code which does item generation.