<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Macro to generate random IDs/passwords in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144368#M261853</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Check UUIDGEN()&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let id=%sysfunc(uuidgen());&lt;/P&gt;&lt;P&gt;%put &amp;amp;id ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Xia Keshan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 30 Jan 2015 08:26:03 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2015-01-30T08:26:03Z</dc:date>
    <item>
      <title>Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144361#M261846</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Courier New'; color: blue; background: white;"&gt;&lt;SPAN style="color: #000000;"&gt;Hi All, I've created the following macro to generate random IDs/passwords. It essentially constructs a data step with a bunch of output statements. It allows the user to specify the allowed characters, number of passwords and password length. Also included is a check to ensure duplicate IDs/passwords are not included.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Courier New'; color: #333333; background: none repeat scroll 0% 0% white;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Courier New'; color: blue; background: white;"&gt;&lt;SPAN style="color: #333333;"&gt;My question: Is there a more efficient way to accomplish this? Tweaks to my code or a fundamentally different approach? This macro bogs down when asked to generate 10000 or more IDs/passwords. I originally tried to generate a DATALINES statement with the macro (not allowed) and also tried PROC SQL INSERT, which works but isn't any faster.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Courier New'; color: blue; background: white;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Courier New'; color: green; background: white;"&gt;*characters to place in the ID, space delimited;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;%let&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; allowed = 1 2 3 4 5 6 7 8 9 a b c d e f h i j k m n p r s t u v w x y z; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; numIDs = 100;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*number of IDs to create;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; idLen = 6;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*number of characters per ID;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="; color: navy; background: white; font-family: 'Courier New';"&gt;&lt;STRONG&gt;%macro&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; &lt;EM style="font-family: 'Courier New';"&gt;&lt;STRONG&gt;ran6&lt;/STRONG&gt;&lt;/EM&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;/*delimeters for concatenating macro variables*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; delim_nospace = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%str&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;();&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; delim_space = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%str&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;( );&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; numChars = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%length&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(compress(&amp;amp;allowed,' '))); &lt;/SPAN&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*num of total characters available;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*%put numchars: &amp;amp;numChars;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; used = ; &lt;/SPAN&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*generate IDs go here to check for duplicates;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*output dataset;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp; data id_output;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp; call streaminit(&lt;/SPAN&gt;&lt;SPAN style="; color: teal; background: white; font-family: 'Courier New';"&gt;&lt;STRONG&gt;23&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;);&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*set random seed;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp; length userID $ &amp;amp;&lt;/SPAN&gt;&lt;SPAN style="color: teal; background: white; font-family: 'Courier New';"&gt;idLen.&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*this loop controls the number of IDs to generate;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%do&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; i = &lt;/SPAN&gt;&lt;SPAN style="; color: teal; background: white; font-family: 'Courier New';"&gt;&lt;STRONG&gt;1&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%to&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; &amp;amp;numIDs;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *this loop controls the length of an ID;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %do&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; j = &lt;/SPAN&gt;&lt;SPAN style="; color: teal; background: white; font-family: 'Courier New';"&gt;&lt;STRONG&gt;1&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%to&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; &amp;amp;idLen;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *follow &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://blogs.sas.com/content/iml/2011/08/24/how-to-generate-random-numbers-in-sas/;"&gt;http://blogs.sas.com/content/iml/2011/08/24/how-to-generate-random-numbers-in-sas/;&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; u = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;( rand(UNIFORM) ); &lt;/SPAN&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;*u is random decimal;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*sysevalf works because &lt;/SPAN&gt;&lt;A _jive_internal="true" href="https://communities.sas.com/message/51523#51523"&gt;https://communities.sas.com/message/51523#51523*/&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; x = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%sysevalf&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(1 + (&amp;amp;numChars - 1 ) * &amp;amp;u.);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&lt;BR /&gt; &lt;BR /&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-family: 'Courier New'; color: green; background: white;"&gt;*set random into with upper bound eq to number of characters;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; k = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%sysevalf&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&amp;amp;numChars * &amp;amp;u , ceil) ; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-family: 'Courier New'; color: green; background: white;"&gt;*pull a letter fro the allowed list;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; IDPart = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%scan&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&amp;amp;allowed.,&amp;amp;k, ' ');&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*%put u: &amp;amp;u&amp;nbsp; x: &amp;amp;x k: &amp;amp;k IDPart: &amp;amp;IDPart;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %if&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; &amp;amp;j = &lt;/SPAN&gt;&lt;SPAN style="; color: teal; background: white; font-family: 'Courier New';"&gt;&lt;STRONG&gt;1&lt;/STRONG&gt;&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%then&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; userID = &amp;amp;IDPart;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*concatenate macro variables, see &lt;/SPAN&gt;&lt;A _jive_internal="true" href="https://communities.sas.com/message/180272#180272"&gt;https://communities.sas.com/message/180272&lt;/A&gt;&lt;SPAN&gt; */&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %else&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; userID = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(catx(&amp;amp;delim_nospace.,&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%nrstr&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%superq&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(userID)),&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%nrstr&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%superq&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(IDPart))));&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*if duplicate found, do not increment i*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %if&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%index&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&amp;amp;used, &amp;amp;userID) &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%then&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; i = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%eval&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&amp;amp;i -1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*no duplicat found, write output statement*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %else&lt;/SPAN&gt; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%do&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userID = &lt;/SPAN&gt;&lt;SPAN style="color: purple; background: white; font-family: 'Courier New';"&gt;"&amp;amp;userID"&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*add mewest ID to macro variable for duplicate checking*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; used = &lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(catx(&amp;amp;delim_space,&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%nrstr&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%superq&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(used)),&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%nrstr&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(&lt;/SPAN&gt;&lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%superq&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;(userID))));&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*%put used: &amp;amp;used;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: green; background: white; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*%put UserID: &amp;amp;userID;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: blue; background: white; font-family: 'Courier New';"&gt;%end&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt; run;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="; color: navy; background: white; font-family: 'Courier New';"&gt;&lt;STRONG&gt;%mend&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: black; background: white; font-family: 'Courier New';"&gt;%&lt;EM style="font-family: 'Courier New';"&gt;&lt;STRONG&gt;ran6&lt;/STRONG&gt;&lt;/EM&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 14:45:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144361#M261846</guid>
      <dc:creator>kbk</dc:creator>
      <dc:date>2015-01-29T14:45:40Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144362#M261847</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Its possible your over complicating things with the macro code:&lt;/P&gt;&lt;P&gt;data temp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; allowed="123456789abcdefghijklmnopqrstuvwxyz";&lt;/P&gt;&lt;P&gt;&amp;nbsp; num_ids=100;&lt;/P&gt;&lt;P&gt;&amp;nbsp; idlen=6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; length my_id $6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; num_allowed=length(strip(allowed));&lt;/P&gt;&lt;P&gt;&amp;nbsp; do i=1 to num_ids;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1 to 6;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp=ceil((num_allowed * rand("uniform")));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; substr(my_id,j,1)=substr(allowed,temp,1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 15:35:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144362#M261847</guid>
      <dc:creator>RW9</dc:creator>
      <dc:date>2015-01-29T15:35:45Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144363#M261848</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi RW9,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Much more elegant solution. The one item missing though is a guard against duplicate IDs. I realize one could generate extra IDs then dedup and reduce to the number needed but I'm trying to avoid that.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 15:41:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144363#M261848</guid>
      <dc:creator>kbk</dc:creator>
      <dc:date>2015-01-29T15:41:15Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144364#M261849</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Your macro bogs down because you are generating thousands of lines of macro code. You have basically created a program that does this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assign value; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assign value; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assign value; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assign value; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* repeat*/&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;where each of those assigns calls a lot of functions&lt;/P&gt;&lt;P&gt;A hint: if you are using that many calls to %sysfunc you might be looking at more of a datastep solution:&lt;/P&gt;&lt;P&gt;%macro ran6(numids= 10, idlen=6, allowed=123456789abcdefhijkmnprstuvwxyz); &lt;BR /&gt;&amp;nbsp; data id_output;&lt;BR /&gt;&amp;nbsp; call streaminit(23);&amp;nbsp; *set random seed;&lt;BR /&gt;&amp;nbsp; length userID $ &amp;amp;idLen.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numchars=length("&amp;amp;allowed");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *this loop controls the number of IDs to generate;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i = 1 to &amp;amp;numIDs;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *this loop controls the length of an ID;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j = 1 to &amp;amp;idLen;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; u =&amp;nbsp; rand('UNIFORM'); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 1 + (numChars - 1 ) * u;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *set random into with upper bound eq to number of characters;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k = ceil(numChars * u) ; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pull a letter fro the allowed list;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IDPart = substr("&amp;amp;allowed",k,1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if j = 1 then userID = IDPart;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*concatenate macro variables, see &lt;A _jive_internal="true" href="https://communities.sas.com/message/180272#180272"&gt;https://communities.sas.com/message/180272&lt;/A&gt; */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else userID = cats(userid,idpart);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;/*j*/&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end; /*i*/&lt;BR /&gt; run;&lt;BR /&gt; /*remove duplicates */&lt;BR /&gt; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; create table UserIds as&lt;BR /&gt;&amp;nbsp;&amp;nbsp; select distinct userid&lt;BR /&gt;&amp;nbsp;&amp;nbsp; from id_output;&lt;BR /&gt; quit;&lt;/P&gt;&lt;P&gt;%mend;&lt;/P&gt;&lt;P&gt;%ran6;&lt;/P&gt;&lt;P&gt;Change the values after the parameters to customize output for a run of the macro:&lt;/P&gt;&lt;P&gt;%ran6(numid=20); to use the default character list and length.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Also, when writing macros it is not a good idea to use the&lt;/P&gt;&lt;P&gt;*text ; style of comment as they are generated in the macro results. Repeatedly.&lt;/P&gt;&lt;P&gt;Use either %* text ; or /* text */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And for the worry about duplicates, generate more than you "need" as the time spent trying to write extra code probably isn't worth much. And you need to deduplicate across multiple uses of the macro anyway. Hint: sql except.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 15:47:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144364#M261849</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2015-01-29T15:47:59Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144365#M261850</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Well, if its a hundred then you could apply them into an array rather than outputting, then keep looping over until the generated text is not in the array.&amp;nbsp; Am leaving for the day, but can update the code tomorrow to this effect e.g. array the_ids{num_ids}...&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 16:24:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144365#M261850</guid>
      <dc:creator>RW9</dc:creator>
      <dc:date>2015-01-29T16:24:11Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144366#M261851</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;PROC PLAN has some features that make this pretty easy.&lt;/P&gt;&lt;DIV style="font-family: Courier New; font-size: 11pt;"&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; allowed = '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z';&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; n = &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%sysfunc&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;(countw(&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%superq&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;allowed&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;)&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;));&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%put&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; NOTE: &amp;amp;=n;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; numIDs = 100;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; background-color: #ffffff;"&gt;*number of IDs to create;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; idLen = 6;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;proc&lt;/STRONG&gt; &lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;plan&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;factors&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; rep=&amp;amp;numids &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;ordered&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; v=&lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;6&lt;/STRONG&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;of&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; &amp;amp;n &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;random&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; / &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;noprint&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;output&lt;/SPAN&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;out&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;=ids v &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;cvals&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;=(&amp;amp;allowed);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;data&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; words;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;do&lt;/SPAN&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;until&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;(last.rep);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;set&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; ids;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;by&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; rep;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;length&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; word $&amp;amp;idlen;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word = cats(word,v);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;end&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;drop&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; v;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;proc&lt;/STRONG&gt; &lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;sort&lt;/STRONG&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;data&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;=words &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;nodupkey&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;by&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; word;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;proc&lt;/STRONG&gt; &lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;sort&lt;/STRONG&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;data&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;=words;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;by&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; rep;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;proc&lt;/STRONG&gt; &lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;print&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV style="font-family: Courier New; font-size: 11pt;"&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV style="font-family: Courier New; font-size: 11pt;"&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;IMG alt="1-29-2015 2-36-12 PM.png" class="jive-image" src="https://communities.sas.com/legacyfs/online/8924_1-29-2015 2-36-12 PM.png" /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 20:36:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144366#M261851</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2015-01-29T20:36:59Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144367#M261852</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;kbk do not make it too complicated when needing performance. A datastep executes fast&lt;BR /&gt;As it is more easy to solve the deduplication afterwards you gains in performance are better.&lt;/P&gt;&lt;P&gt;I you know hashing you could use that also. The overhead will be that check (in memory) and the memory constraint.&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Jan 2015 21:02:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144367#M261852</guid>
      <dc:creator>jakarman</dc:creator>
      <dc:date>2015-01-29T21:02:03Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144368#M261853</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Check UUIDGEN()&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let id=%sysfunc(uuidgen());&lt;/P&gt;&lt;P&gt;%put &amp;amp;id ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Xia Keshan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Jan 2015 08:26:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144368#M261853</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2015-01-30T08:26:03Z</dc:date>
    </item>
    <item>
      <title>Re: Macro to generate random IDs/passwords</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144369#M261854</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Just to finish off from where I was yesterday, this should give unique results:&lt;/P&gt;&lt;P&gt;data temp (keep=id_out);&lt;/P&gt;&lt;P&gt;&amp;nbsp; allowed="123456789abcdefghijklmnopqrstuvwxyz";&lt;/P&gt;&lt;P&gt;&amp;nbsp; num_ids=100;&lt;/P&gt;&lt;P&gt;&amp;nbsp; idlen=6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; array done{100} $200.;&lt;/P&gt;&lt;P&gt;&amp;nbsp; length my_id $6;&lt;/P&gt;&lt;P&gt;&amp;nbsp; num_allowed=length(strip(allowed));&lt;/P&gt;&lt;P&gt;&amp;nbsp; i=1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; do until (i=num_ids+1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1 to 6;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp=ceil((num_allowed * rand("uniform")));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; substr(my_id,j,1)=substr(allowed,temp,1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if whichc(my_id,of done{*})=0 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; done{i}=my_id;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i=i+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id_out=my_id;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Jan 2015 13:10:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-to-generate-random-IDs-passwords/m-p/144369#M261854</guid>
      <dc:creator>RW9</dc:creator>
      <dc:date>2015-01-30T13:10:42Z</dc:date>
    </item>
  </channel>
</rss>

