Have a look how trees are placed generally, in cStructGenTrees::GenStructures(). First the generator decides how many trees it's gonna place in a chunk (GetNumTrees()), then for each tree it picks a random coordinate pair within the chunk (GenerateSingleTree()) and tries to grow a tree there (GetTreeImageByBiome()). Use a similar approach for lily pads - in each chunk, pick a few random coordpairs and place lily pads if they fit (above water, free block).
EDIT: Lily pads are much easier than trees, because they are single-block, they don't need any of the "neighboring chunk" processing that trees must do.
EDIT: Lily pads are much easier than trees, because they are single-block, they don't need any of the "neighboring chunk" processing that trees must do.