This REXX program generates credit card numbers (16 digits – no Amex), checks if the number is valid using Luhn algorithm and prints it to OUTDD.
/**************************** REXX *********************************/ "FREE FI(outdd)" "ALLOC FI(outdd) DA('Z00324.OUTPUT(CUST16)') SHR REUSE" out_ctr = 0 valid_count = 0 DO WHILE (valid_count < 500) CALL GENERATE ccvalid.1 = randomcc CALL LUHN IF LUHN(ccvalid.1) THEN DO "EXECIO 1 DISKW outdd (STEM ccvalid. " out_ctr = out_ctr + 1 valid_count = valid_count + 1 END END IF out_ctr > 0 THEN DO "EXECIO 0 DISKW outdd (FINIS" SAY 'File outdd now contains ' out_ctr' lines.' END ELSE DO "EXECIO 0 DISKW outdd (OPEN FINIS" SAY 'File outdd is now empty.' END "FREE FI(outdd)" EXIT GENERATE: DO x=1 to 4 by 1 randomdig.x = RANDOM(1000,9999) END randomcc = randomdig.1 || randomdig.2 || randomdig.3 || randomdig.4 RETURN LUHN: sum=0 even=0 DO i=length(randomcc) TO 1 BY -1 c=SUBSTR(randomcc,i,1) IF even THEN DO c=c*2 IF c>=10 THEN c=c-9 END even=\even sum=sum+c END RETURN right(sum,1)=0