Stat Generation based On Cards
A problem with rolling 12d24 is that you're going to run out of rolls if there are any duplicates (and there will be).
So you have two broad methods:
Roll each card uniquely
Create a table with 24 entries (1: 4 of hearts, 2: 4 of clubs, 3: 4 of diamonds, 4: 4 of spades, 5: 5 of hearts, 6: 5 of clubs, etc.).
Roll 1d24 for your first card and look it up in the table.
Roll 1d23 for your second card and look it up in the table, skipping any card you already got.
Roll 1d22 for your third card and look it up on the table, skipping any card you already got.
Examples: Rolls are 12, 7, 5. That's 6 of spades (12), 5 of diamonds (7) and 5 of hearts (5). No skipping happened because the rolls were always decreasing.
Rolls are 5, 7, 12. That's 5 of hearts (5), 5 of spades (7 + 1 because the 5 of hearts is skipped) and 7 of clubs (12 + 2 because the 5 of hearts and 5 of spades are skipped). Simple skipping because the rolls are far apart.
Rolls are 5, 12, 7. That's 5 of hearts (5), 7 of hearts (12 + 1 because the 5 of hearts is skipped) and 5 of spades (7 + 1 because the 5 of hearts is skipped).
Rolls are 3, 3, 3. That's 4 of diamonds (3), 4 of spades (3 + 1 because 4 of diamonds is skipped) and 5 of hearts (3 + 2 because 4 of spades and 4 of diamonds are skipped). Two adjacent cards are skipped together since there is none between them.
Rolls are 3, 4, 3. That's 4 of diamonds (3), 5 of hearts (4 + 1 because the 4 of diamonds is skipped) and 4 of spades (3 + 1 because the 4 of diamonds is skipped). A roll can end up in the gap between two cards.
Rolls are 3, 4, 4. That's 4 of diamonds and 5 of hearts (as above), then 5 of clubs (4 + 2 because both cards are skipped. If only one were skipped, 4 + 1 would give the 5 of hearts, which was already drawn). Counting down the list can be easier than tracking the skip distances.
Allow for error and revise dice pools
The first method guarantees that you'll get things done in 23 rolls (rolling 1d1 is sort of pointless). This method can involve more rolls, but the table is much easier to deal with.
Roll 16d24, and look up the results on the table, ignoring all duplicates. This will get you between 1 (you rolled the same number 16 times) and 16 (no doubles) values.
If you still need more numbers, rebuild the table to exclude the numbers you already rolled, and use a smaller die. Make another 12 rolls.
If you still need more numbers, repeat.
You could just roll lots of d24, but if you want to get all the cards it becomes rather difficult and long as you'll get lots of duplicates.
Example: Rolls are 5, 7, 12, 18, 3, 9. No doubles! You get the cards corresponding to 3, 5, 7, 9, 12, and 18 on the table. More rolls are done with d18 rather than d24, excluding the cards corresponding to the numbers you got.
Rolls are 5, 7, 5, 12, 9, 9. Some doubles. You get the cards corresponding to 5, 7, 9, and 12 on the table. More rolls are done with d20 rather than d24, excluding the cards corresponding to the numbers you got.
Rolls are 5, 5, 5, 5, 5, 5. All duplicates. You get the card corresponding to 5 on the table. More rolls are probably done with d24, because rebuilding the table for just one number is sort of wasteful (you'll have to skip any 5s you roll).
Cheat
Ways to bypass the issue!
Use point totals. All characters have the same total number of points, so let them assign them as they wish, with minimum and maximum values (8 to 18). Not random, but gets what you're after. You may want to restrict players to having at most 2 attributes at 18 or 8 (four 4s or four 9s), if it's an issue.
Complementary attributes. Roll 2d6 for a pair of attributes. One of the attributes is set to result + 6, the other is set to 20 - result. This way, the attributes add up to 26 per pair, ranging between 8 and 18, and you get some randomness. The issue is that you every expert has a major weak point (8 and 18) rather than some experts being below par elsewhere (18, 11, 11, 12 across four attributes, avoiding the 8). Someone may be (un)lucky enough to get three or more 18s (and 8s) this way.
Split pools. Building on complementary attributes and point totals, roll 6d6 for a trio of attributes. Assign the results as you wish (6 + 2 dice), then do the same for three other attributes, using the dice complements (7 - die). 18s become more likely (just need two 6s out of six rolls, rather than two rolls), and you still have chances of more than two 18s.
Example: Rolls are 2, 3, 4, 4, 5, 6. The complementary rolls are 5 (7 - 2), 4 (7 - 3), 3 (7 - 4), 3 (7 - 4), 2 (7 - 5), 1 (7 - 6). So your first three attributes could be 12 (2, 4), 13 (3, 4), 17 (5, 6) or 14 (2, 6), 14 (3, 5), 14 (4, 4). Your other three attributes could be 9 (1, 2), 12 (3, 3), 15 (4, 5) or 11 (1, 4), 12 (3, 3), 13 (2, 5). Or many other combinations.
Using the rolling approaches, if you really want to avoid three or more 18s, just require rerolls if they occur (using 1d4+4 instead), so extra values range from 5 to 8. If that gives too many 16s too... don't use these shortcuts.